|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,/ T$ k, g6 d2 z5 p8 O
input mcasp_ahclkx,
& o$ m( \1 s' X. c" G @' einput mcasp_aclkx,
1 |" ?9 |, W5 G( [1 i$ u6 hinput axr0,( j4 `* L3 g3 T) M( k- N
! [4 ?6 U9 ?8 {. X. I* `8 u6 A
output mcasp_afsr,% ?; _+ w9 p7 V
output mcasp_ahclkr,
( b" d1 D6 K" n* boutput mcasp_aclkr,
; F: e& A& |9 _5 U- a7 Koutput axr1,
8 ?+ w# \6 C$ q U# J, m. v assign mcasp_afsr = mcasp_afsx;
, ]! z* d& B5 L; R p& gassign mcasp_aclkr = mcasp_aclkx;5 C2 l( B- r1 S f' A
assign mcasp_ahclkr = mcasp_ahclkx;
' y# J( O b5 w* _assign axr1 = axr0; 2 J, H3 z! \9 p4 O6 T1 ^
! h8 B! T1 N, @" ]" N! l* `在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 8 o( j" A2 r; i4 |" m
static void McASPI2SConfigure(void)
) X9 C: x9 {; D0 m6 f8 i! a' ]{
% o: O5 N- ^% Q0 v2 FMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
% M/ I& X. R) TMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
4 A6 }; k& F& U/ B) B: DMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
I) M1 c: P0 a" X$ a7 WMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */: k7 @0 u: d R
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; I# o* j- u0 L0 Q2 u9 Q; K
MCASP_RX_MODE_DMA);: Q" m3 w& ~( k9 b
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,# @, x, {' Q% j1 X( `! A m' e, j
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */2 Z% \/ m' @* I
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, " t( i5 c) [' p9 Z# F
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);: ^$ I4 J! U% n7 U* ~" ~8 j e
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
. O6 f& N, W. Q- N: d0 kMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */7 _2 ?( |' P# W: I$ L. n0 {
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);4 V9 l' u1 S3 y# Q
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); * {$ ^+ ]4 [) | V) P
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,# R( P8 z6 H) l6 W; O, {
0x00, 0xFF); /* configure the clock for transmitter */
* B- c' P6 W$ U4 n2 E' H# |' c* gMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);1 P7 ?3 @. f1 Y" K
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 2 l9 O1 K: D# U8 H* z
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
t# }5 H! Y+ l( b- }" P0x00, 0xFF);. a: R$ s* D% ^, I( r$ k
: P" M5 Y: k3 D0 e- G9 L9 u
/* Enable synchronization of RX and TX sections */
! a4 X" x# X$ k0 X! ~) VMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
8 {$ w: ?1 p" b/ m% w: UMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
9 [9 ` b3 \7 ` tMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
/ d& i @2 s% c( B** Set the serializers, Currently only one serializer is set as- s8 v M' u6 h5 U9 o# h _9 _2 T
** transmitter and one serializer as receiver.9 A: F" ~% q* k
*/7 E# S9 m1 x/ D2 r$ H/ X
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
3 y# F2 V& z: r% F# N+ fMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*) m5 L* i9 h# ^% C* T
** Configure the McASP pins ; A8 l5 `3 }. g6 z8 C4 y" }3 P
** Input - Frame Sync, Clock and Serializer Rx
3 b& d# l) A9 _2 Y! K3 Y% R** Output - Serializer Tx is connected to the input of the codec 1 E# R, b# I& g: A
*/4 y" d3 s8 y5 {/ v3 A: k$ D
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);8 D# [. V- \- q/ b# i0 P4 s
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));% j& ^# a3 K+ r- `
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX) M/ v8 }- P. p4 l) {/ s
| MCASP_PIN_ACLKX; T9 v( e% n% n
| MCASP_PIN_AHCLKX
$ d0 W. @9 e! y+ A" Z| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
! C J/ k+ v: H" k4 t6 a7 FMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 8 a8 g+ h8 S/ T3 ]$ P
| MCASP_TX_CLKFAIL : M" }" f4 O; y- o" d3 O% x
| MCASP_TX_SYNCERROR/ h3 R4 [* c0 \- k) m l8 P
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 0 b! h2 f5 A7 W7 f
| MCASP_RX_CLKFAIL8 g2 j1 |/ P5 N' T3 O- f3 i
| MCASP_RX_SYNCERROR
6 Y+ V! c5 N: w6 H9 a| MCASP_RX_OVERRUN);
4 ~. e- ]9 X% c) |& c} static void I2SDataTxRxActivate(void)
6 \6 _3 y7 ]0 |- r# {{5 W- ~, L* J& q2 @) S1 S
/* Start the clocks */
/ J i; ^/ n+ T* I* m1 pMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
d* ~' X# z* L7 M' TMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
, N, {+ V& ^& N4 j6 aEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
* d/ y( q$ x/ W5 K3 D" }EDMA3_TRIG_MODE_EVENT);& i/ `4 B/ u* _0 L* N: P) U
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, . ?9 r$ J, A9 D& o4 A# K7 G \
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */* D9 n: E: B! X H+ P F
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS); x' M* x1 a' F% }
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
( x. T) l3 k' nwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */$ i: b4 l/ g' X$ Q: D$ b
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
3 O- c2 r" I6 n- v, I6 BMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);2 E$ O1 d7 L% [5 ^
}
$ Z0 d8 s8 B8 D3 R请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. . d9 u# ], K- e: M$ I {
|