|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,$ x6 a# ^7 m3 e1 y* I
input mcasp_ahclkx,8 Z" Y3 a2 C6 i1 ~# l R4 T, A
input mcasp_aclkx, _' _+ C ^/ J" Z1 C; `
input axr0,) E S# ~! N) b+ Q: K$ y
T9 O+ n/ m z" g# d' g
output mcasp_afsr,
3 t$ }! l! j# t0 Z" G' y- qoutput mcasp_ahclkr,) Z" H# |! H8 H( q, F# M. p I
output mcasp_aclkr,9 U! z% V: M% a* a. q4 N4 S2 u! p
output axr1,& W. J4 j9 t5 x. t
assign mcasp_afsr = mcasp_afsx;0 N* w4 M( M1 J; I$ \- i8 V
assign mcasp_aclkr = mcasp_aclkx;% ^$ g/ y0 P( N6 p
assign mcasp_ahclkr = mcasp_ahclkx;: U" ~ f9 f6 Q7 ]; E
assign axr1 = axr0; 4 n/ ^( r1 G9 \5 F$ E/ w3 n6 T
9 W& J, M1 @5 s/ a' }在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 6 x- r6 \2 H: D% m( T
static void McASPI2SConfigure(void). R7 x# u2 T2 D! B1 d1 Z
{" J! \2 [0 C, ]( ?" r1 @
McASPRxReset(SOC_MCASP_0_CTRL_REGS);% l A7 z5 `9 |* b2 X- B
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
0 R+ j1 R2 d$ n5 mMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);) W9 C# ]2 K' R2 `% H7 Q
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
1 h4 K+ m: n& F, m, K+ F: ]& hMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 i1 x' C% O$ k& S% g
MCASP_RX_MODE_DMA);. B: W' l2 ^9 o
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,1 ~) |. [" J% A
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
! s5 ]+ `- }- L( @McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ' Y4 u4 h2 I, U, N+ X& k' `
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);$ I& M5 y- D U
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
9 F, p- [+ S6 }# F" n9 @MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */) y: u- X9 D' m
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);+ U$ ?1 Y# T* [) h p* ^
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); % _4 D0 {3 L8 p" h7 |$ z+ k
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
, W4 x( Q# ~+ T0 a0x00, 0xFF); /* configure the clock for transmitter */
) X3 z# e# i6 zMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
" T7 W6 P$ Z1 ]( k _, PMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
5 t' J3 }& k8 M+ A; h' K1 K! _5 ]0 pMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,: }- k. V. e/ Y# }" u# s) d
0x00, 0xFF);
- l8 u' Y* @) L" {" u
* U1 H+ p5 U$ }: @/* Enable synchronization of RX and TX sections */
- O. s3 F: I1 O+ X1 g6 wMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */" Y$ p. N* L! A9 N0 P, V" a
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);/ y% \9 ]; a: a% t$ m+ f
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
) _1 N+ n6 b- q% n4 b, p) R% j" O! [** Set the serializers, Currently only one serializer is set as
# \2 G( V9 g r1 _* q** transmitter and one serializer as receiver.8 t8 b% B: }# o4 U* c+ R
*/
5 B/ Z6 f; i! t6 q9 IMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);' x. |* v7 \2 f! o
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
9 h4 R1 E9 q/ N5 O9 [1 w5 ~9 {** Configure the McASP pins
; ?& a3 c9 N2 E t) e** Input - Frame Sync, Clock and Serializer Rx
) o4 [8 y- g+ z1 G; Q8 w3 R4 [** Output - Serializer Tx is connected to the input of the codec
# ]# I" S+ T4 [; h# J*/
* t% ^( w0 t. ^( |: P6 lMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);/ D1 L7 I' Z/ p
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));2 y- ^# d# t7 B8 j5 ^7 D, h
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX& q% v. v8 ?7 J: `; h% e
| MCASP_PIN_ACLKX: D9 ~3 r0 X8 F2 C, C
| MCASP_PIN_AHCLKX
6 Y' N* B% l& f9 p: D1 m* C5 ^. a| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */0 Y& m" c1 |/ g
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR / `/ X+ B, {) Q3 w1 l
| MCASP_TX_CLKFAIL
: E0 ]7 U7 a; B# {/ ` L# ~# J) Z| MCASP_TX_SYNCERROR
; W2 A4 ?! B' `/ B8 x* ]| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 5 T3 l4 M5 m4 Z$ k
| MCASP_RX_CLKFAIL
' X# I k( g9 s C6 n| MCASP_RX_SYNCERROR 5 E+ |# }% ]+ n _, s
| MCASP_RX_OVERRUN);$ x8 \( P( M# `1 A' B
} static void I2SDataTxRxActivate(void)
: g7 h: z j5 P+ Z/ g) w{: b' q4 t, p o7 x! ~0 }; g
/* Start the clocks */
- t; ?2 l: G2 F* d4 H0 x! t3 ?McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);& y' G r+ P$ j5 \5 T
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
& |( U1 S6 p4 w7 j3 U# L6 ]! aEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,6 x9 e% v/ t) _. i) Z9 Q& f: h
EDMA3_TRIG_MODE_EVENT);
4 h, S! g( v3 N4 {7 i( lEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
" g R8 z* t1 MEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
' K: ]' n: ]3 ?, h# }0 `# PMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
% K P8 Z v* U% H# e& m+ kMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */1 U' I% B- e- k% ~# S# y, C
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
6 U5 p. G8 {) N8 V1 ~9 h) o% d! aMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
) w; B2 U2 N4 f5 Z- KMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
' \9 i9 t% A# s}
$ x2 Z& @0 o2 i$ @请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
! A7 C0 ^2 U) ~# [3 u' V6 e1 E |