|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
4 U7 C5 u& P$ W1 Q( [input mcasp_ahclkx,
' r$ ~ Q# T3 m* y/ einput mcasp_aclkx,
* `. ~9 |) |' `input axr0,9 Y" c% j; m+ f6 U0 {3 Z
8 ]3 |+ M: U" ~( b4 d; q$ S
output mcasp_afsr,( O5 l% x& \% \1 ^& u
output mcasp_ahclkr,0 @1 _) r2 n1 d
output mcasp_aclkr,8 Y2 R5 e# X5 ^& s E5 b
output axr1,2 [& W/ K1 G! N3 e( c
assign mcasp_afsr = mcasp_afsx;+ T. S% [" b+ c$ Q3 f( {3 R
assign mcasp_aclkr = mcasp_aclkx;
) s9 v/ t1 l$ i3 V7 Dassign mcasp_ahclkr = mcasp_ahclkx;% C& _3 G" v# {: r
assign axr1 = axr0; : ~: t5 A5 G0 ~7 ^6 g* q4 H
) @0 X) v# \/ Z$ M( Q% e在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 l9 l! T- K% K Z0 R8 h
static void McASPI2SConfigure(void)$ w9 e) ?6 m& `1 d {( l# Y6 }. s
{# O: X5 w* M" s- M6 d
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
7 K2 M, R9 w# a1 AMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
* s$ @: r# f2 Z3 Z! w# V1 `( K; tMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);0 q( J8 y3 n' e+ ^4 f/ c" x
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
; Q2 P0 ~8 j/ R0 L: n. Y( sMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* v7 \* T N7 Y5 L1 g1 T. JMCASP_RX_MODE_DMA);
k9 |/ H/ E" p: t$ JMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: r( \" ]4 H% E. Y7 d
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
e |. d, `8 P. `6 }McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
* q: M) u: B% r) x, S2 e* p% W+ mMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);. u3 M4 g0 G2 |/ ]: _
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, " h" ?$ Z2 L8 u& {# g
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */ e3 @9 N( q( _ m
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);$ t& B* a( _1 C9 l2 }
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); # k* w" _0 U6 A: w1 z8 ?
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
M/ c; D7 g6 X- P0x00, 0xFF); /* configure the clock for transmitter */7 n ~& ~. A I1 ^3 |
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
3 \0 Y4 ~* ]1 m+ j9 Y' U; fMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); / Q! _+ \2 ]/ \' V
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,8 B, O" X2 a0 j5 [1 D
0x00, 0xFF);
: M$ d/ T) l! S9 ?/ _9 p/ o0 g* F
/* Enable synchronization of RX and TX sections */ 9 j0 o' p' X& h4 A
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
& H, F/ k; s5 A6 C$ vMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
. o& w/ @, A( M3 PMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*: C+ v$ t7 J; S& v3 G+ Z4 P
** Set the serializers, Currently only one serializer is set as
7 W* Z" E) s2 f5 c/ T, l4 _# A5 U** transmitter and one serializer as receiver.
~8 ~+ S- Z' p0 A0 n# y*/
8 X$ ` N$ W8 \0 IMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);/ e& p7 c+ p$ Y) _6 V
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*$ d! }* e: d3 m8 \
** Configure the McASP pins
Y& g" A/ M; w** Input - Frame Sync, Clock and Serializer Rx
9 s7 g3 ?& O& P% j** Output - Serializer Tx is connected to the input of the codec ' q0 U& S$ i- f( T& W1 U+ i
*/$ N2 @2 V+ f! y* p- a% V
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);8 ~9 I# D" O! X) c
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));! w4 q& ?/ k9 S, q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX" B, U8 J' D- M Q: @
| MCASP_PIN_ACLKX
2 w" o0 p; _+ J+ r; F& L| MCASP_PIN_AHCLKX
U. b4 g) F B/ W$ E| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */% j% x; F, {/ z8 p5 B( B2 [' w
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR + @/ C" ]& P0 y% \
| MCASP_TX_CLKFAIL ' V3 R' V4 X( M4 e% P# F
| MCASP_TX_SYNCERROR. Y9 S& Y; }3 {5 j7 y1 C# S4 ]0 i
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
$ Y3 k/ ^% @) ^, |4 M# ]6 T* f| MCASP_RX_CLKFAIL* D' e" O1 f% ` n* J5 Z& ^
| MCASP_RX_SYNCERROR
( e" v7 Y L% ?2 z/ N: g: d| MCASP_RX_OVERRUN);
3 L. p- u! g% p6 ~9 ~* |/ ? S} static void I2SDataTxRxActivate(void)
- w0 I, W/ E+ b+ Q* J# T" n, B" F! A{
9 l' O7 f1 T6 Y) k- m* G/* Start the clocks */9 L7 M! g& ]3 b: Y$ e5 h
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
1 Y; y! p* q5 s2 jMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
! w2 p' }! X p8 g* S8 FEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,2 V7 P. d5 t: ~5 Q6 o+ F7 l
EDMA3_TRIG_MODE_EVENT);+ u/ \0 s* h8 U; v
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 3 O! F+ v* j5 ?9 U) A! N5 M
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */, A/ G4 z W$ L3 D
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
4 {2 A# b1 d6 s4 k3 T( m# ]- \7 oMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
" e4 D2 b5 B, H4 H: u# P; uwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */4 R% K3 i- Q* z% l' T8 ]$ l6 r
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);, P: W7 J, G- o. v1 n" ^6 M
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
* Z% H( r, a4 H} ! z. q( ~5 |- w4 v" E- X
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. , F6 n1 C6 X2 S
|