|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,7 M- k# F% N) P% J
input mcasp_ahclkx,# Q+ g7 w" z4 \: L! l
input mcasp_aclkx,% h& J, X0 n: j9 u+ B9 ^, y5 d* U
input axr0,/ M- u& Q5 o7 b- G
U5 a: s3 H& W; Y% T, e9 f
output mcasp_afsr,
0 c4 i4 ?' B1 T, ]% `output mcasp_ahclkr,- L( l& |$ M5 J3 m! C) o
output mcasp_aclkr,7 O0 ]: f9 F+ [% m
output axr1,
7 e0 ?# }# F# r6 x assign mcasp_afsr = mcasp_afsx;; E6 {# H- j) n3 n1 v
assign mcasp_aclkr = mcasp_aclkx;" Z- K1 m, f; ^" W% i
assign mcasp_ahclkr = mcasp_ahclkx;8 p+ J, u& X6 @1 F1 \0 d
assign axr1 = axr0; 7 b$ n$ d) C; F. f0 b; H" V$ R* C
# q- w/ F: N- M$ U8 h在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
! t2 i, V2 ]- G9 B5 u. J! Gstatic void McASPI2SConfigure(void)
$ [0 E1 ~3 i9 m* C Q0 |+ z{) n0 f2 q9 a. V& k
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
2 P# D+ [2 |! m: { d$ r- DMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
5 H" v/ i. |& e* j3 X- {McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);9 |/ f7 a9 v( v5 J
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */" r. e$ e$ w6 B6 |. ?
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 o# v1 G& b& S& A2 K/ cMCASP_RX_MODE_DMA);
- w" o, s/ Z& l$ z* KMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,5 Z; ^7 q! c& y7 ?2 x
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
+ K% k4 Z9 c' oMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
# ?. ]- c: J" q4 h8 A/ T" b9 A; PMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
: i! {! v) @# }McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 1 A- P5 V( `; _& g
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
* z# ]9 E' H1 a* J8 }McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);; D6 x4 e! ?+ {5 r3 M
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); % @7 D D( i& J' _$ P
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
4 a; j( ], P: E0x00, 0xFF); /* configure the clock for transmitter */2 M( p5 m$ M% [0 P2 K
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
+ ], ~3 ]! H0 Q2 X& y# WMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
+ W5 U0 G: F5 ]* ^% kMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,9 B, a( A3 P& a7 l0 _7 i( ^
0x00, 0xFF);
5 x4 v1 n1 h6 k2 ^6 Y4 O
6 v7 N9 e% J# o9 I9 ]) e/* Enable synchronization of RX and TX sections */
- U+ X. G! P4 F# G0 w kMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */* b& D3 u w: y( ^
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);# c' t. p9 F1 B) E6 ?& |
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
/ O# [' V7 [3 x k: D** Set the serializers, Currently only one serializer is set as
, E. k" U5 F" U4 r5 [ _* {5 e** transmitter and one serializer as receiver.
: O: c! ?# s* ^4 I*/6 ~7 C# f J" A! w9 t; c
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
, {- Q$ x5 K1 t5 ^% d" r8 gMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*; D% d$ r) g) g; d! p3 [; C0 R
** Configure the McASP pins
U, [* T) g( S3 v/ X** Input - Frame Sync, Clock and Serializer Rx
6 h. A5 [4 Z& O4 Q# _** Output - Serializer Tx is connected to the input of the codec
8 @: k4 {; n {; W*/+ a% d/ K+ l9 h& E# |$ X2 }$ ~
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);7 G& I$ T) J& f6 h- f
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));' N4 r2 }' S1 ?9 y0 B4 r0 K
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
# }7 P! Q# Y* N. F| MCASP_PIN_ACLKX7 y- i/ R) T7 D/ n; Z# m, O' d* @
| MCASP_PIN_AHCLKX
/ ]$ k7 i* C6 Z/ a7 B ~ i6 n| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
9 z5 w! J! j0 D3 w) o! R7 BMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR - `4 {. X# j, v* @% j4 X- P
| MCASP_TX_CLKFAIL
2 J8 q5 k8 Y3 a2 V4 X6 _7 }' |3 ^# N| MCASP_TX_SYNCERROR T; [+ Q6 |3 Q% L& V
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ; I0 u. J* c$ p8 y9 b
| MCASP_RX_CLKFAIL
- y/ ~: n! L9 W: \# G| MCASP_RX_SYNCERROR
$ n) h/ Q3 A* c| MCASP_RX_OVERRUN);
) V2 X7 i5 ~. A- v} static void I2SDataTxRxActivate(void)
4 h5 a; y+ A' Z7 m{
( w- ~% Z0 ~ ~. `/* Start the clocks */" I9 ]0 w, M( ^2 R0 o; L
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);; d" U& _1 Y0 @/ o
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer *// Y* w [4 r9 J' [: o5 ~5 y
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
( }- p1 Y$ Q% g7 ^: A; M8 bEDMA3_TRIG_MODE_EVENT);
|3 o2 H/ s1 h# j" G( b5 IEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
2 X9 Q: T! R% O5 Q# M# X, zEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */3 n& Y% ]! P9 p8 [
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);( M6 B+ w6 w; g& h, ^
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */) R7 c& \- a$ F" ~& e
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
( t# n- k* `. W9 ^McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
, G M" \8 ^' Z9 x2 zMcASPTxEnable(SOC_MCASP_0_CTRL_REGS); F# s6 C% q* [7 l. B3 n5 r9 {
}
/ i0 T J) F' t$ B% h% Y2 v/ Z请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. : ^& ~+ S$ B' Z9 f! {/ m: e
|