|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,' a& t; T8 W9 ?' x
input mcasp_ahclkx,' A# l, j. z# N+ A+ B( Z" \
input mcasp_aclkx,
" F; z A3 G2 v, G: A6 Ainput axr0,
1 Z( @" ]8 N0 B8 \$ q/ c. m* T% }9 Z
output mcasp_afsr,
+ d" P h# [: L) ]% moutput mcasp_ahclkr,% n4 d3 i5 K2 v$ a2 Z8 l: d3 I9 @
output mcasp_aclkr,) K0 j. X( y3 q; E
output axr1,
0 R* U& m& ]. z4 X) s) o, R assign mcasp_afsr = mcasp_afsx;: K( h; q, Q$ F8 J
assign mcasp_aclkr = mcasp_aclkx;
* K; k0 y# o4 P# ?2 passign mcasp_ahclkr = mcasp_ahclkx;3 U" o0 Q/ g1 s5 F
assign axr1 = axr0;
7 h2 [& O& @. N' m5 R7 p$ P- O$ H; G# @+ [! J
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
. l& z" ]1 N- e2 sstatic void McASPI2SConfigure(void)/ e+ e" r) e; G: G& G
{
6 z: s4 \# E P, K3 k( j eMcASPRxReset(SOC_MCASP_0_CTRL_REGS);* `! T$ x4 `% r% t; @
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */& B5 G' x% r9 p+ u3 U
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
' @: k2 a' W( S4 q4 k4 W* sMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */4 j6 `& s, y$ Z
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
, }4 S8 ?0 x; [. D) P" O. T7 [MCASP_RX_MODE_DMA);0 K, J' K. X) z2 B$ c' B
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 }) v/ A9 L( ?0 s5 Q$ SMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */+ y1 Q/ z+ L+ P7 e- C6 \
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, : M7 O- i9 I* {, [
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);' ]5 q Q, d& A& u. [
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
7 B2 `1 R5 U# y7 ^; V7 z: oMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
3 G8 i, l, T( C H1 uMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);" {# W% O" V2 j; L) \: |
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
. X2 X* P0 Z5 h! I/ i/ rMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
4 ~7 B) {. T! M0x00, 0xFF); /* configure the clock for transmitter */, q/ E' H7 f' w- x# [. g
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
: i2 a" e; Y4 c; o: v5 nMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); - @& Y0 X u5 b; e
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
* ]! l" q7 B/ c+ k8 e6 o0x00, 0xFF);9 I3 Z4 d0 o/ i% P
O- O7 I( x+ w
/* Enable synchronization of RX and TX sections */ " e+ Q3 ~* {$ Y3 J; @- s% A. }
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
# z, y" A6 `% o) \6 Q, x" J0 AMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
( V. l9 R6 [3 j5 rMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
2 {. ]7 u4 [% e$ X; Z- X) H** Set the serializers, Currently only one serializer is set as7 a& F6 y' e3 V/ e1 ?
** transmitter and one serializer as receiver.
/ H9 e; ^# q3 j2 E9 }, p8 ^) m3 k9 {2 Y*/1 N/ {: u) G% @7 |' f, N# w
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);7 Y! @6 e( M9 O; X+ f
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
2 a% a, I+ m' z% n9 G- o** Configure the McASP pins * ~4 Z5 p. p5 [3 y
** Input - Frame Sync, Clock and Serializer Rx
+ N# ~$ P% D) e- b7 f' x2 v; {** Output - Serializer Tx is connected to the input of the codec 2 Q4 i; q3 E# }8 x3 [5 M6 x
*/! L3 I% d6 l( u3 r/ A, j3 h
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
+ V, ~: d) D0 e. TMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));6 z, y, C, T: X8 G; X8 X
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX7 f9 X$ r5 H6 ^* Y( i4 Y
| MCASP_PIN_ACLKX- R$ Y; _$ u8 g% H# b1 j& ?4 c
| MCASP_PIN_AHCLKX
, c3 J0 s, Y3 c/ M9 R8 ^3 n+ || MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
8 O3 o* V8 B' v# A( a. G( G( IMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 3 Z6 B/ B; Z/ |: n! F) ^8 h
| MCASP_TX_CLKFAIL
4 b0 N; m% f, q0 k7 l| MCASP_TX_SYNCERROR3 r- U" o' d1 I) `+ r. T
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
% n* S% @. p* _& k& x! ~) V& Y$ x" O- z3 O| MCASP_RX_CLKFAIL/ o$ D0 m1 |9 X" X$ Z
| MCASP_RX_SYNCERROR
$ Q$ O" r. j9 \7 z- V| MCASP_RX_OVERRUN);/ Y! {( n7 F& x& O' v" w
} static void I2SDataTxRxActivate(void)3 @ n- f) R7 r. Q. n
{
* _' X8 Y% ]5 q) ] O! N/* Start the clocks */
7 [8 ?7 @5 k0 Z& U: D1 @) {McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
# t8 o. N2 W% U% e' LMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
# h6 L9 l' Z, A' O2 G" g2 vEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,. i5 p6 D. Z) d, ^6 D9 ] H
EDMA3_TRIG_MODE_EVENT);
' a) {: ^0 |: C& i. I9 E& p" N) Y0 LEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, - k2 ^$ T9 G& L6 m# M0 f7 k
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
' m. v2 _0 F' s `+ ^McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);( U- G0 [- ?3 b' }1 a7 O
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */- ?+ p# J* f6 l* Y
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
( K1 E) M5 G: Q2 @% wMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);) J8 n, U! z! B& o5 h
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);, O$ M- J o- r M @ ~0 E
} 2 W- ?; f6 z, S0 L
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. . k! E) w7 O5 u; y; h7 o% ]
|