|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,4 m: T0 B, W2 `, n5 a. i: T8 X# G
input mcasp_ahclkx,
) b; j, F2 U) |+ Sinput mcasp_aclkx,4 x) [2 X$ V* t3 R1 P
input axr0,
& Z4 `3 d5 S8 E5 s8 F! L5 W; K3 j+ j
8 g# z0 _) ]0 {: c( w3 routput mcasp_afsr,1 y Y" F5 _, s$ ^. `
output mcasp_ahclkr,1 L% j3 }9 l/ u& M& _: b
output mcasp_aclkr,: G; e3 C! m5 i( \3 \ E: a5 r$ B
output axr1,
) @1 ]8 g4 G2 k4 d7 O2 T assign mcasp_afsr = mcasp_afsx;6 W P3 I! ]- v, ]& g
assign mcasp_aclkr = mcasp_aclkx;
# h% L" K( h6 J' D& u% w @assign mcasp_ahclkr = mcasp_ahclkx;
( h7 X4 l2 Y6 O; h8 }* `assign axr1 = axr0;
: e9 M; d* o4 M' X6 c3 W/ u7 L; j
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
1 H* ^- a) H: b7 _4 o6 w- Hstatic void McASPI2SConfigure(void)
9 k* k4 T! U7 U. s( P! I3 i* a, `{
" C+ |- M+ s& |. G2 aMcASPRxReset(SOC_MCASP_0_CTRL_REGS);$ U) y, g7 t. ^( M. `
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
# S! t6 \, ~/ w/ KMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);) S- Y, y0 x! w9 f
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
+ [! f7 M' \' y5 s" n! bMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ V! S2 O# A1 n/ }MCASP_RX_MODE_DMA);
4 ^8 ~+ b: ^6 l* e! ~: mMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 L+ k n9 U s# ]; Y
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */. A- P% A& C1 X+ t- P. B% c
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
5 w9 E, Q' u, S4 @0 G9 E: @& i- GMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
) l5 m$ |, L2 v: D3 KMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
' |3 |+ G% z8 I1 U0 _- F6 n6 GMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
3 t& Q; R+ p9 C0 T( N5 AMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);, A- S% w) W2 {" i; W: C/ ~% a( W2 S
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 3 O/ Y3 [; p9 [
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
6 Z1 d$ M9 m; x( ^3 @4 a$ S0 y0x00, 0xFF); /* configure the clock for transmitter */
! x6 m& w$ Q% q) `7 H% l+ Z, `McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
% c k! s* @1 b" U" MMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
- S' \% m. D. K. Z$ }McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
8 G% Q3 @1 Y8 h6 A0x00, 0xFF);% Q4 e2 C# n! p7 R1 Q3 n
/ P9 `) J# F8 s; p" `8 h7 I/* Enable synchronization of RX and TX sections */ / P+ M0 |) u9 q2 C9 r" `0 Q
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
8 B5 \0 l, R0 Y/ E% p: A5 O) _4 g+ BMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);6 [4 d2 A( x7 M+ C% [6 F
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
% P- i: [4 r" M8 y0 m) `( I& G** Set the serializers, Currently only one serializer is set as6 h( b% ]4 {4 b5 X
** transmitter and one serializer as receiver.# T g( f1 b+ i6 p
*/
, }- u# _( e5 O% V# V p3 g- _7 ^McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
- Y; W3 C7 [& d+ |McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*2 Y- p' t8 ?7 G/ y Q9 ]
** Configure the McASP pins & L1 j l! [( B8 o) a0 M7 B3 e
** Input - Frame Sync, Clock and Serializer Rx7 `5 b6 ?) E4 a6 |3 j$ e
** Output - Serializer Tx is connected to the input of the codec " z Y0 O6 x4 J, l7 v |
*/
4 Q/ W5 F8 o( k7 y1 M) h2 r2 mMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);8 r9 k/ O) {* D8 B5 z" d: d
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
6 _- Q1 o, ~- |! t: n/ gMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX8 t+ I' a& ~+ R4 m2 L, ^2 ?
| MCASP_PIN_ACLKX
, O A* @! t8 y) g| MCASP_PIN_AHCLKX
' @: ^. O) |% v) q; u" r| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */5 B% y% u0 p# {
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
4 z8 m+ {# W- I; v$ l6 n1 y| MCASP_TX_CLKFAIL ( C8 H& A7 |2 D. ~' L( [% h
| MCASP_TX_SYNCERROR
. D: {: X4 C# w| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
, |8 j9 W7 L% S| MCASP_RX_CLKFAIL C* p* @& X9 A4 A3 v. z# g
| MCASP_RX_SYNCERROR
8 h; I5 P- _! E4 W/ r4 x7 v1 U& M| MCASP_RX_OVERRUN);$ b9 g' j5 ~/ {3 e* A
} static void I2SDataTxRxActivate(void)5 ^5 F$ ]5 a" s# e
{3 C( J# K g( y- F# ~
/* Start the clocks */; ~8 \7 L' [5 g6 |. e& s S
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);; p4 h% V' \" {# Z
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
0 I' N7 L* x% F b5 F1 \& |EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
3 G$ I* Z, Z# Y7 |2 P1 x; E1 _EDMA3_TRIG_MODE_EVENT);* _' u0 K P$ m9 ]/ M/ Y5 \. [
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 4 M& ~8 a& y" q: D# d4 n- n
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */( }6 b/ `* e9 X5 v8 F r
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
/ B Q4 r" ]" Y% g; ?; CMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
3 |0 J. [5 x- E& Bwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
/ s" A$ V4 u/ c) O4 s1 U) h( f% _McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
3 k6 ]/ Y4 `# y+ T+ J. J3 SMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
" U) G7 {4 s }, i" ?' Q0 v}
; A' x* \5 ^ w9 a9 l9 X9 j" T请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. L2 z: x" R0 A7 l" l
|