|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
! R5 I: m* q1 |5 [input mcasp_ahclkx,
( @+ ?: S3 J: einput mcasp_aclkx,* |* O- I: l1 `) I5 k
input axr0,
# U8 @0 W# |/ ~) a2 u- i, a4 @
( O" H* u8 c2 v4 }; woutput mcasp_afsr,7 \8 b/ J/ e$ j4 @' F0 t
output mcasp_ahclkr,; E0 X* r, i$ v
output mcasp_aclkr,
/ b. f. m/ B' O$ l2 G3 K" G0 ~output axr1,; |& f9 D) e$ t
assign mcasp_afsr = mcasp_afsx;! Y$ C0 F! h4 R5 |1 F1 }
assign mcasp_aclkr = mcasp_aclkx;; R- N$ O) l! n. W
assign mcasp_ahclkr = mcasp_ahclkx;
, T/ O) x7 G9 U- l& Fassign axr1 = axr0;
4 p9 k8 P$ e( w, D; ~7 { U6 |9 O _- H+ w
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
+ L# z9 O% i* y4 Zstatic void McASPI2SConfigure(void)+ Z( ]8 e6 y" T2 c% Q+ T) l
{3 [7 y- f0 i& f3 x
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
1 ~$ [$ \1 f! l2 I2 M0 _McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */5 d2 G1 n: e) A' i% ]& x# }
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);& x! K0 [+ h0 p' b3 T& ?! _0 f
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */5 P1 q* G2 y9 [ ^
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' l$ ^* a8 g% s/ ]0 G5 D/ Z H
MCASP_RX_MODE_DMA);
( n) p4 H% }' s$ o9 L5 hMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 g5 Y4 R2 N( x4 A$ k$ @) [9 S
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
7 d8 J6 S! ^8 Z DMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
- L$ @1 R3 M( I8 XMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);- x( K7 R4 T4 M, A
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
/ R8 Q, `0 N# E y; {4 V4 }/ g' cMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */: c: d! I5 X& B& u; a3 _
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
, k7 }8 d% n2 e1 C2 PMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); % r* e1 n# e! O3 e8 `. z/ F4 m0 M7 o
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
W' Z! j" z( r& f0x00, 0xFF); /* configure the clock for transmitter */
/ P* d/ k; w9 @0 x* vMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
* B- b$ Z$ J6 B$ e! o+ [: ]McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); . U1 s/ i q# W0 ~ k/ U
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,8 R. P9 T+ {* P% ^5 B
0x00, 0xFF);9 n' o" s# l4 ^4 F/ u. \, K h: D
6 h A" r2 {: ?1 M! Q/* Enable synchronization of RX and TX sections */
$ J# c( F& X/ m5 ^5 ?7 L! XMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
, V: w: W, x! _8 f/ L& X! p QMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);" `5 q% e a; a3 ~
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
/ r* ^, U' d" L) G/ l2 c** Set the serializers, Currently only one serializer is set as9 _7 a$ _* ^7 X/ p/ u! V
** transmitter and one serializer as receiver.
" v h# e" b$ ^; P% @' C*/
+ c B$ h+ L; vMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
6 T% t2 D0 \' n6 _/ O. \' DMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*2 W( j3 r( Q* w' u
** Configure the McASP pins 0 S; p7 a) H2 x& o
** Input - Frame Sync, Clock and Serializer Rx
% w3 M# A& s! j7 W7 r- o1 C8 b** Output - Serializer Tx is connected to the input of the codec
1 _6 p6 _& O: r- @, L( c*/: Z& |2 x: i, J( j
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
5 ?4 s" W; c1 SMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
7 J/ E; r- ?/ {McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX; H f1 K- p8 E3 \ S$ I$ m) f
| MCASP_PIN_ACLKX
+ F8 _1 S- E. n8 S* U6 h* H| MCASP_PIN_AHCLKX7 c- X7 ]7 H* S
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
1 k1 U6 K& i( m7 H' w" gMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
1 D4 N% ]4 ~: B. l0 _| MCASP_TX_CLKFAIL 0 j! A0 W/ H; F, j8 Q* |
| MCASP_TX_SYNCERROR
5 P. U+ v y) g9 g) F) t| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 4 Y% Y8 e! z$ S2 p2 G( A
| MCASP_RX_CLKFAIL
! e+ t; K* x8 j| MCASP_RX_SYNCERROR
- K0 g4 I# J& G7 ?5 r. g| MCASP_RX_OVERRUN);
/ e) u Q- b( A' |$ b0 f* i} static void I2SDataTxRxActivate(void)
3 r) K! r$ s7 C& p{6 i6 M# L( q1 g' Q4 I
/* Start the clocks */) C4 a7 [: b. J4 w: w4 {
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
2 W6 r5 ], X+ X8 h( u0 y; G) u$ UMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
& l: l, S) n, p2 fEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,1 F2 P8 B, A( d+ L2 e
EDMA3_TRIG_MODE_EVENT);) a& [: H# x* z F u4 b- x
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 1 ` V0 y" r) U& b4 {/ m
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
+ y- N* s! c6 I/ ]. NMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);/ q9 b- u M! v9 T' c
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */0 _( V9 H* p+ Z8 e- c" H
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */: f, X2 S$ p2 A, O( F
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);' u! J/ r* e* x/ s! _0 x h( H- A
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);9 @6 E& y; _/ F3 y9 L1 z4 q: [& b
}
3 q. z) O; m( w, }' o请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
t+ E- I. ?) q |