|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,6 k9 h0 u; r$ m. a$ x: d$ Y O
input mcasp_ahclkx,' N: d" t2 Z# `8 A
input mcasp_aclkx,
9 w! J8 }- a: \) e/ u' zinput axr0,
' P; @ j) C) X' C6 I, H% l; {
+ H% _* J: a& Y% x# q4 doutput mcasp_afsr,
- B& l. V. u9 r6 N3 ~6 }6 K Youtput mcasp_ahclkr,6 z- u; r" X1 ?- u2 ]* G# u
output mcasp_aclkr,
: @& Y4 q/ i1 {6 Xoutput axr1,
/ E) R: L/ }6 _) f assign mcasp_afsr = mcasp_afsx;, T& S6 j3 w1 p+ a6 Y8 v
assign mcasp_aclkr = mcasp_aclkx;* |) I4 _8 H; G! K$ \7 t
assign mcasp_ahclkr = mcasp_ahclkx;# [$ B7 }8 f% ~4 J# M
assign axr1 = axr0; + c: P" l' m( L, J* j/ {
. U4 ?0 E4 U. Q* O- s8 r在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
/ [% @% G- ~, Y# `6 `7 Kstatic void McASPI2SConfigure(void)
7 Z. K9 ~( x y+ ^- O7 v, ~{% I; f$ h$ h6 j6 }. \
McASPRxReset(SOC_MCASP_0_CTRL_REGS);( }; m2 v+ N0 D. m( p5 w
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
: ^. _7 A% R: c: `McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);: [$ ~6 e" G( P9 f- q
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */ K% V# Z6 K! [& ~: \% G
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" p. b8 L5 V1 ?4 j1 n+ vMCASP_RX_MODE_DMA);# L; p( D+ R3 G
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! e' \, K, P4 j3 r
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
) r, j) ~0 ~; b! A! L+ LMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, , X. p* ]( A2 D
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE); ?9 s C+ z% u9 q$ W& B
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 7 ]6 L4 k U7 _6 T, O2 f) N
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
$ z; T4 G# d; v' o0 z6 l" u* iMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);3 M7 c" _; ^- q+ M6 u
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
c1 Z2 _2 B! A7 r, rMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
1 @ l5 C2 F9 C0x00, 0xFF); /* configure the clock for transmitter */
! ^9 _4 ~# z; }3 p$ h+ z3 ~McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);; {) s ^4 |: ]9 z( K- `
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
& Q( w3 B- { C* {8 @: B& aMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
; _8 U: E% |8 ]( {0x00, 0xFF);
/ m* \: N' v1 F; j# m0 x: Y, j; A7 Y4 y# c( K0 Y) j9 Y
/* Enable synchronization of RX and TX sections */
5 V% T$ B( g1 Z# Z) ]3 ^! E: mMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
z1 h B# f! x5 i. J* Y0 NMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);9 z/ v2 m$ }/ M+ A
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*. x0 x$ J/ Y8 ~7 d7 l
** Set the serializers, Currently only one serializer is set as& k5 S: ~. j. _9 w8 u2 X
** transmitter and one serializer as receiver.6 v+ A4 T: M9 l! U2 a
*/
* A2 }7 A, c4 Y( B' G: lMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);, J% _1 N& Q# _ U
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*+ ^, C* Z3 y/ u) c: k
** Configure the McASP pins
, O1 ]% i" Q$ F$ m3 U1 p** Input - Frame Sync, Clock and Serializer Rx
" P+ b" I; }' H" l** Output - Serializer Tx is connected to the input of the codec 0 R8 d: T( U0 c& _ o# Z
*/* l C* n+ j7 D1 n* }1 A
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
! H% h. w6 Q2 f1 ]0 cMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));7 w( Q7 n) R# o/ H/ d) B
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX4 X1 M, O7 V$ q/ T" @. v1 K- w9 a9 H
| MCASP_PIN_ACLKX
) J% I- |$ A( y2 s| MCASP_PIN_AHCLKX: [! O$ q* {; w$ N0 H
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */0 K, a+ {, j0 g, u' U4 u( M+ }9 n
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
: s& Y% P& H! r| MCASP_TX_CLKFAIL
7 B Y* G6 W: N; y8 |8 r| MCASP_TX_SYNCERROR
% b! q4 T% _* ]( Y: F| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 9 a4 Q. B1 W8 |5 ?" [
| MCASP_RX_CLKFAIL
# C, b/ j! G8 ]$ }* P( B| MCASP_RX_SYNCERROR
" _6 ?0 T$ K* q, F8 k* E| MCASP_RX_OVERRUN);
# \0 _' m! w6 T- N, _} static void I2SDataTxRxActivate(void)4 o9 q+ f' B9 o3 B) i) |
{
+ @6 j9 }- ~" o6 h. n. H/* Start the clocks */
6 C+ ?$ R8 |9 ]McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
6 V$ \/ G, `& x) ?% ?McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
9 }6 _; k! W( j* x2 E3 a r1 z/ OEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
" Q* i- G1 x+ V4 A# BEDMA3_TRIG_MODE_EVENT);# a: p$ [" s6 R5 ^5 }4 U: B6 r
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
( o3 ?2 Y3 |8 a9 r! g" x! C) sEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
3 I! N7 R5 a- ]% x8 u. pMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
) C0 L2 {! \, }+ @7 `McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */1 q6 g9 V* E+ r; y9 e9 f$ z, E- y
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */: R4 Z: A2 h/ H7 X4 a! G
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);9 _. u, i# x9 F' }( W: f+ ]* j" K
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);" ?% k y5 S, i9 |6 `/ Z H7 j3 M
} ( v( S, P6 _, I* I/ @
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
0 ~0 s+ w& e2 J$ q4 \( s |