|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
& F c* N7 a- @" J! [input mcasp_ahclkx,) ]0 J$ o' v! [; ~
input mcasp_aclkx,
! s. |7 p! Y# G5 f9 Q% Yinput axr0, r" N0 g2 a9 x6 r. K0 q$ H
- ~& X( l: Q6 }& H- }output mcasp_afsr,
( J+ I. b* d$ J4 K5 i# e C6 m0 ?5 coutput mcasp_ahclkr,
: j* V% ]5 e5 o( Loutput mcasp_aclkr,
. o9 u. f$ A9 u% B* w5 T4 Doutput axr1,$ x6 O; n# f' Z& R& ]
assign mcasp_afsr = mcasp_afsx;" B: g$ B# q' n, h3 c# T2 C- P' a
assign mcasp_aclkr = mcasp_aclkx;+ k" |( o7 `1 R% e' ~9 t: j2 _
assign mcasp_ahclkr = mcasp_ahclkx;/ ]) g5 C8 G' k4 P: z! C. q
assign axr1 = axr0; ; L3 c4 @& W# m5 I
2 Z$ A! U# U) f3 F8 Q
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 - F% E+ s4 J( t9 w9 P/ b+ P [& ~
static void McASPI2SConfigure(void)" q- U2 c. A/ w: w. P9 B
{
/ v2 w; `* j2 z6 _8 }McASPRxReset(SOC_MCASP_0_CTRL_REGS);
" o, [0 c7 O( J+ _3 C1 HMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */7 C9 |, ]$ z% ~8 n
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);9 A* l' G+ ~- h
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */( |: l# t. k T2 h6 U& D
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
; K" ?+ p6 W8 r+ `( E+ EMCASP_RX_MODE_DMA);
- _2 l% ]" c' L' D/ nMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 X$ J: G& }7 L8 F- H3 oMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
; E# |- {/ y0 `McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, , p" _9 J/ y* p! S. u
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
6 T. @# ?4 G) R; v1 Z5 ?McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, / H4 ~" F; U' ?- Z& u% q+ D
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
! ^2 D3 \8 a- C% s- g7 iMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
4 _4 D% x: W/ ]. g$ ^McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
. s# J5 V1 }" t9 _7 @McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,1 i9 V0 m5 B2 v2 |# l
0x00, 0xFF); /* configure the clock for transmitter */, t: I/ l; v4 e0 r9 r
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);0 K+ t' R6 [' B7 u
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
# c2 J+ K2 Y; l. [McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
1 G+ h" j$ Y, ]0x00, 0xFF);
' B0 @3 e0 z, P% v/ c8 f! d) q, R2 ?) ?# y" h
/* Enable synchronization of RX and TX sections */
/ R3 r3 A5 Q1 Q: R& GMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */6 L6 y ]% E J8 E. _$ Q/ I
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);9 ^: o$ m/ b" P9 i2 W
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /** X4 q8 e) J7 H0 G. b
** Set the serializers, Currently only one serializer is set as
! R0 @ M# c) q** transmitter and one serializer as receiver.
% ~# C. F; u# ?4 j1 v3 Y/ F*/* @- x, Y- A% R1 l9 l7 }
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);! D2 r( r! b( `3 t- T$ L
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*: I: t) {7 @% m8 _& z$ T. a
** Configure the McASP pins
" e V2 y' }& ?& j# b** Input - Frame Sync, Clock and Serializer Rx' G/ ^+ a$ G1 S3 F, C* T
** Output - Serializer Tx is connected to the input of the codec 4 A7 q$ Q8 L' f0 d: A6 x
*/) |1 y& i" b* T7 t& B4 z3 t0 o
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
" Z- B. B: f" m' ]6 R" F4 {+ \McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
$ C, l: m5 q& W5 o4 dMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX9 u/ b4 J. M% v& Y1 U, a
| MCASP_PIN_ACLKX
9 Z p+ I- d% a& r$ a, V$ Q| MCASP_PIN_AHCLKX! H. d; z: W6 r9 I0 b
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */: o, |; E( B4 k+ C- a/ X
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
1 s) Y3 l _, m% H| MCASP_TX_CLKFAIL % o( X& s. o z, c7 F
| MCASP_TX_SYNCERROR
7 L+ G$ Y& {3 y. ]1 T; `9 d; F6 g| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ! U- t- M& i+ V+ ]
| MCASP_RX_CLKFAIL* I9 \. e* K$ a8 I0 N
| MCASP_RX_SYNCERROR ' ~1 r! n: a4 t& ]
| MCASP_RX_OVERRUN);
" u- t& F3 @4 k" O! ?3 o/ Z$ K9 w; k} static void I2SDataTxRxActivate(void)
4 x+ C5 f& p" P" |{
; B5 V' F6 E0 a3 E5 H/* Start the clocks */
* g1 M' x, s1 a9 @McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
) P' A: b, |- ]: q! `McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
9 n- v# z( H2 y5 c* {) {8 R; tEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX, G" j6 }) A7 H3 X
EDMA3_TRIG_MODE_EVENT);
# w) ^, T* N! r' L2 i/ r: GEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ' Z& q" H' p N( i, B. M
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
/ D$ F& n2 m. l/ p, DMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
4 j T# T8 J2 k& ~6 L: TMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
% T5 p! @- U6 ?+ X0 u+ l0 o2 R/ R/ |0 Awhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
" c6 r; h+ V+ w2 M! P& HMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
4 `0 m, ^" k3 l3 d/ w& `McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
" [* |9 i# [ f6 ~3 v- ~- A} & n1 G% T" u- \& F8 ~
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ' | `$ D8 A8 J1 Z0 }) e
|