|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
7 m8 ?! c6 I2 s3 e* i: x* s9 rinput mcasp_ahclkx,. o. w2 {: N& \% F9 x3 S/ ^& X) o/ p
input mcasp_aclkx,' ~, J4 y1 J+ J' T
input axr0,# H9 m8 M/ ] ]* E. u' S
" u! F1 J; O" V" J6 ^" Doutput mcasp_afsr,+ @* b% T- P* y1 |9 g9 \; |
output mcasp_ahclkr,# X! X" O! r) S; B
output mcasp_aclkr,/ x. { h, e% J5 L& p
output axr1,: D& u" m' c* b3 P# q+ \9 @0 b; _7 {
assign mcasp_afsr = mcasp_afsx;
2 t8 |- D7 J# ^& Qassign mcasp_aclkr = mcasp_aclkx;9 Z5 h8 z& k. Y" X. g8 |" r7 H
assign mcasp_ahclkr = mcasp_ahclkx;
/ h5 N6 q" Y8 A. T! \+ p5 sassign axr1 = axr0;
7 f( }" _1 {3 [ z$ H" E1 C, r! s% p& ]* F" }
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
8 t% O- d D Y- R e$ T, fstatic void McASPI2SConfigure(void)
$ w& q$ Q# U. o- h/ k{
: G9 L9 i" C: vMcASPRxReset(SOC_MCASP_0_CTRL_REGS);/ d6 W, [3 l( r8 i* f% S
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */7 t) O; |8 Z$ |5 c/ e$ b+ |; [* R( t
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
- i, }7 j5 C5 t6 IMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
; ~8 c1 A4 B) a% `2 qMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) P( l& _+ x2 K# k: E" rMCASP_RX_MODE_DMA);9 Y7 R7 b! ?' s& Z3 h q
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,% I" ^+ J/ ~: @& O% N8 u! b
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */: b. T% t# W* ]; w6 K$ W
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 7 Y, _3 U+ u9 y: _1 S1 V* u
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);; R) ^/ u, @/ Q# l; k
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ! l( x" j4 z* O+ i6 h/ g
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */1 w8 x* Y' Z8 w- S6 ^: _* c- @
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
$ w* U& B6 }) h& \9 e7 hMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & B3 |6 K1 h; F: ]" o2 w9 R
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,$ _/ j% G R1 N9 V# G& {+ q
0x00, 0xFF); /* configure the clock for transmitter */% J' D8 t, _/ X' R* R- C
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);& k6 d$ [, q/ i7 U/ z. x2 V O+ i
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
$ c" o8 s& t$ H4 O6 r2 @McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
Q% h) ~2 s) H. T3 Z6 e7 t0x00, 0xFF);
% \$ [1 W$ m8 R6 j+ O3 b8 ^: \/ J( b! b2 q& F3 I; y8 d
/* Enable synchronization of RX and TX sections */ * i; |4 y- Z- v& r$ L
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */; x" t9 }+ |% V: }
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
5 y6 B" }! Y3 G% l/ l, u' _3 `McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*; }$ p( W! Q# U' H7 {
** Set the serializers, Currently only one serializer is set as6 N0 S& A' Y6 M6 p
** transmitter and one serializer as receiver.
+ {4 g( `, E/ R' @3 _*/
; @9 j( s3 s8 H4 Y/ M, j6 J- {McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
e& z/ B* Q" k* vMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
& I4 Q: E3 `" d; J1 _% e6 U" w** Configure the McASP pins
# ?- T7 |& l5 x6 L3 b1 K** Input - Frame Sync, Clock and Serializer Rx1 a! S. Q# u5 v+ [* F6 c
** Output - Serializer Tx is connected to the input of the codec ! s2 ^$ s ?0 D7 G* |
*/7 v8 H3 w6 U0 b+ O8 b* t& B+ t
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);9 j h& s M6 t+ X, n
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
8 }5 p. S( W" R$ O& ~. VMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX* X+ c0 F% k$ k; g0 |! u6 M
| MCASP_PIN_ACLKX
: y: o2 \) l) I6 i| MCASP_PIN_AHCLKX
" T1 r5 x9 t4 u1 Q" t| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */4 z. R4 r& W" _
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
& h7 T- m+ x0 O3 `| MCASP_TX_CLKFAIL $ M. _2 c3 g! T3 c* S, X
| MCASP_TX_SYNCERROR
. j: e5 t c. _ R| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 9 w: e/ y0 ~& Q' S4 d$ t
| MCASP_RX_CLKFAIL5 P2 ?% N, p' y
| MCASP_RX_SYNCERROR
% y% W0 m" e- \6 z| MCASP_RX_OVERRUN);; v( _* b. b, e
} static void I2SDataTxRxActivate(void)
) K' {) W& b3 o1 G! W' t8 B1 S! w{
# l; }/ H% S) B: c/* Start the clocks */( Y6 s1 P: i& s5 p. {0 I
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
2 L/ J; j" w: h: b7 t, T& lMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
4 D; J( h0 m* s# x: qEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
" P: ~* C+ q/ ?, M2 H: T9 \EDMA3_TRIG_MODE_EVENT);
O6 {7 l9 Y0 s/ \, n/ V& c2 nEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, % T. A$ [+ D( i: A' k
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
% ^7 n" e+ b; c& G% ?7 e4 vMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);4 |/ d l* [1 i6 M: l
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */2 o% ~5 {; y# B; {* D! H/ Z6 I+ G8 q
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
* q" {& Q5 `1 v/ ^1 L+ pMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);4 R3 h d2 Z' ^* \
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);! G/ |6 {, X" }5 ~# M
} 2 T& d9 ~0 ^5 i1 q" _4 \3 [
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
5 ] m) ]# U2 m- i |