|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
% M' l7 q D" U" L* y H4 zinput mcasp_ahclkx,
3 n7 d' R7 F7 n Qinput mcasp_aclkx,* G/ C0 D# z# w+ q
input axr0,
% v7 C! u& T4 _$ Y( Z2 z2 w7 t9 K" ?( I2 c8 c( L
output mcasp_afsr,3 F/ W& |2 Y! L, T3 Q
output mcasp_ahclkr,
2 O$ ?, o6 h t$ _( W/ F$ s7 Aoutput mcasp_aclkr,
: _5 g0 ~" F0 O% L8 V& `output axr1,
& T. c x2 V7 }- ]0 M. W" B/ F assign mcasp_afsr = mcasp_afsx;
* \' F8 m4 L1 }assign mcasp_aclkr = mcasp_aclkx;
7 @. E6 I* C/ i3 g9 r- Cassign mcasp_ahclkr = mcasp_ahclkx;
; n+ k( N- x. Lassign axr1 = axr0;
+ y, u, x4 P2 N0 R7 b6 A* ?; s1 m7 Y. [* u
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 5 q0 x( J* d: i% Y; H
static void McASPI2SConfigure(void)
0 ]& Y8 S2 Q. H- m{
* O- s7 w- ~0 X3 dMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
, x8 e% G1 @ K- g2 AMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
8 H r' n$ C% Y9 c! s: e% O& y. i: lMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); K* L z1 q& x: d
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
- A- M- Q1 P/ x4 m& X9 \% `5 k( @McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. C9 L# g& s5 d: u# @MCASP_RX_MODE_DMA);
0 a' S. n9 ^, x) P6 zMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# A. S) q% y1 G! C Q7 n' O, iMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */9 h( L- h; B1 L4 S5 H. x& x
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 5 U7 I. s5 H2 h
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
$ U$ R, `" T) s O; Q8 B' ~# mMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
$ h: X* W* h4 t% LMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */% C1 j! N$ a* r* C$ q: d5 p
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);1 G9 `+ T' O1 F' b/ o& G2 `9 ?
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
2 e" Z# Y# c9 y/ @McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,% h6 B) c5 z! @5 r0 N; t1 h
0x00, 0xFF); /* configure the clock for transmitter */
1 u Z& c3 t. S+ d7 {# u5 ` _( vMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);' z. E8 O8 d5 Q( B* l: ^5 c5 P3 n! s0 v
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); # _9 B0 ^$ D+ ?3 N: q+ B
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,9 K- {% Y9 o) U; p( o
0x00, 0xFF);! C+ y4 G. l) d" y
1 T& r# u5 h2 Y( K; @% O% L& |/* Enable synchronization of RX and TX sections */ 3 I- G' Q1 \5 X1 @+ w4 z+ d
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
& X7 e' Z- J" @2 N$ vMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); W) t' ?( }3 I) ^
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*$ h- u5 B7 o; I* ^1 p6 C+ V) q
** Set the serializers, Currently only one serializer is set as
! F- k9 O+ ^; o! i** transmitter and one serializer as receiver./ Q) i& k7 N7 e7 j0 ]: r
*/
- k5 D$ K+ c3 F lMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);6 t# ^& E+ y6 ^# j0 G
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
5 w& I- v1 K$ e5 m# Z0 J- w' g7 B** Configure the McASP pins 4 r. x& F1 _& L$ B5 |2 e2 Y" h' E
** Input - Frame Sync, Clock and Serializer Rx C/ Z) @& h" G% i
** Output - Serializer Tx is connected to the input of the codec 8 P/ J: k7 H o
*/
0 n8 D8 S# T8 X- y5 U- I& M/ c0 {, yMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);, V1 \+ G$ c/ |0 h
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));0 | x8 I; b, k. K
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
' T2 Y% p, I4 @0 u8 {( l* \| MCASP_PIN_ACLKX
) W7 R8 H6 [1 \9 U* ]- A| MCASP_PIN_AHCLKX
7 J- H, v6 H; _% }5 Z/ z5 C4 E| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
0 Y' R% B8 x# j9 I5 EMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
: D, y6 t1 T8 B& N3 l. X| MCASP_TX_CLKFAIL , Y+ W7 r) U4 C0 \. y3 P" G
| MCASP_TX_SYNCERROR( }. M5 r( a! |+ m% T. T
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 3 d. g$ V6 Q. J& S: J
| MCASP_RX_CLKFAIL+ T# E6 p; }4 E& T- T- i$ t
| MCASP_RX_SYNCERROR 4 J7 d; [& y5 r/ f! Q7 s8 f
| MCASP_RX_OVERRUN);
& \( S' f$ L" g! x' ^} static void I2SDataTxRxActivate(void)6 M! ]5 T& M1 l S3 B2 A
{
* I j: X$ i; p- q/* Start the clocks */: u3 n7 I- p/ E) p8 Z% u1 k
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
& X, d) U& c2 X8 B, p2 U3 P2 U8 DMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
$ r; L- M& `! A }4 ?EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
m+ K5 D+ D3 O. dEDMA3_TRIG_MODE_EVENT);! t) X9 o. x, F" q3 r8 b
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, , N2 j# @% k4 t2 E+ E
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
- E2 ]. r7 c( {9 \) U+ V4 ]6 KMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);- G# _7 X2 z, a8 L! W$ i
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
+ [! y" o$ k7 R9 Jwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */' N+ `$ s4 d9 U. x) k$ R1 W- T6 \& z
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
) j7 R- L) M U0 c8 ?# ]$ pMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);9 V* t" b3 P+ Y
}
, n" U, w8 d' s5 ]) k请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. % @' u- u8 a! ?' e
|