|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,# }* R* X' k4 [3 g" Z! }7 q
input mcasp_ahclkx,
; Q* _# s) ?; H& Ginput mcasp_aclkx,
5 [- Q0 M* ^( T2 v% }) e# d; Finput axr0,! b8 G2 i8 R0 K9 n
' _: l$ o4 ?6 r# H- G/ @6 koutput mcasp_afsr,
+ G- D* n) Q* S* p0 [3 Xoutput mcasp_ahclkr,3 w5 q) K S, Q: L) ^3 M
output mcasp_aclkr,
_. V4 ?& y6 B3 w0 Koutput axr1,
/ R) [- P2 ~; M8 O assign mcasp_afsr = mcasp_afsx;% l- w# u" Y- K' @
assign mcasp_aclkr = mcasp_aclkx;3 M" r, {0 J! y! Y0 a: c# P) X3 m
assign mcasp_ahclkr = mcasp_ahclkx;$ @* a+ H8 o* c+ x: p
assign axr1 = axr0;
* G/ j) y5 X' ^3 @% h, Z
) u7 `1 C1 J, q& X9 t* l在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
2 @. l3 P$ L# k" Rstatic void McASPI2SConfigure(void)
% d+ Z7 @4 N+ q0 Q0 K{
8 t% y1 K( I3 l( oMcASPRxReset(SOC_MCASP_0_CTRL_REGS); G3 o& n7 k. n! y4 z
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
! q! c6 t7 X _6 |" H9 R: `McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
& C& x5 F, E; J2 W, iMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */% C- Y0 L6 K1 f7 x* f+ h- ]
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- J! `. I* X6 YMCASP_RX_MODE_DMA);) U1 S, T* l3 c: V% n
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 {1 M( m4 r1 f3 g4 c0 f
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */& Z8 d5 Q8 O9 |9 j/ _0 g7 O
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, & S* S3 r6 u: T/ P( Z
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);! \ X5 ^+ x4 W2 j
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
! J" w* U5 ~4 o! x% J+ H6 `MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
) a2 d, r! p4 n; N7 AMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
( ^$ ^- S3 i7 s; VMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
+ R2 E1 \7 s) d! E. T6 p# GMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,# n% |$ O$ ]/ Q# K* R0 Q" B
0x00, 0xFF); /* configure the clock for transmitter */9 B, j i; D2 c8 U9 N
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);% |9 z4 f& [% I' L, w. g/ L8 Q
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 0 Z2 U. t8 h) r" `, k# r
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
( ^% u2 t, n& ?7 O0x00, 0xFF);' j$ q$ C! _. Q4 f% s! r. Q
- ]3 _0 O+ I' }) Z7 e6 |/* Enable synchronization of RX and TX sections */ 7 E; ~% z9 U) e0 T' {
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
' G. V: q' s9 B$ _0 c5 M' o; u' DMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); G6 ]( Z6 @+ k$ K' A9 r4 R
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /** v+ ]# A9 o3 P# ?9 x
** Set the serializers, Currently only one serializer is set as
! t: e0 _$ K. B8 j' ]. g/ b** transmitter and one serializer as receiver.
5 N9 q+ B2 R# J" {% j1 w# X*/
. e+ S3 k5 V2 g4 u, v. o, IMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);1 y E; @6 H1 z# y
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*# A9 Y0 F0 q, d& A# [. L
** Configure the McASP pins
3 {' z V5 K5 A# {. u* T** Input - Frame Sync, Clock and Serializer Rx
+ U, I A- e) [. C$ m3 T** Output - Serializer Tx is connected to the input of the codec
$ C: K$ H; l) q: p: i" k j*/
4 {) |8 I5 J$ I8 YMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);" D' y; `! ], z7 b0 R
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));+ o7 [" t1 h+ L z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX( E/ n7 S7 ]. O1 j
| MCASP_PIN_ACLKX
) g$ z& Y+ ?4 s) J6 i| MCASP_PIN_AHCLKX
+ e) f/ b$ L* d| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
) z; P2 H. P v6 HMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
# ~) j- X- b8 m. a/ g| MCASP_TX_CLKFAIL
; Z) ~" c% j y, d7 m2 D| MCASP_TX_SYNCERROR
- m( l. X( |: V0 Y X# ]2 k| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR , ^' }' |; b6 {* l$ W4 T, y9 N/ h
| MCASP_RX_CLKFAIL
9 K" W/ A. W, ~* C| MCASP_RX_SYNCERROR - ]" t6 [& G# E0 U4 x4 s
| MCASP_RX_OVERRUN);3 l: n. @% [8 C/ g t" a
} static void I2SDataTxRxActivate(void)/ ~: m4 |; d1 W5 M) y* h' S" {- Q6 s
{3 {; t0 |2 J% w
/* Start the clocks */$ V' G! h0 |' v" {3 S
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);0 X2 J, w" A/ R' e8 u) Q8 o' o
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer *// y# B$ r( v P- w" n. X- v" b
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
: r: i7 k9 E3 n1 d" ^1 R$ {EDMA3_TRIG_MODE_EVENT);/ s6 Z+ e0 I" N7 V) F
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
$ A" \: s Y/ q9 dEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */$ Y" a: A+ n! y. U. |: [
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);4 L2 _, {/ ~4 D' K
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */+ f( b7 r& r7 U& ^! y
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */5 N( o+ Y0 J* u( k& C e# @
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);4 z4 s$ `3 s. @& f, m% Q3 K' H% T
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);, E9 l I) G9 p L5 ~
}
. i4 |! E" X6 e0 o请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. . [7 O: C' o' X0 A3 S
|