|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,7 X$ v3 T! l' t9 C/ x; h
input mcasp_ahclkx,
* X5 [/ L3 o3 w8 Dinput mcasp_aclkx," T( U" X6 P3 q
input axr0,
5 t% @0 g4 f) F1 @* E9 v
. x8 u, |/ {4 x S9 Uoutput mcasp_afsr,% w: W- U% }$ @1 a
output mcasp_ahclkr,
6 J' E& e) m' [output mcasp_aclkr,1 Z' n+ K0 {* D& G9 x
output axr1,
2 c' \4 |! i& _( }0 r4 Y assign mcasp_afsr = mcasp_afsx;( N! `: e7 C, H5 B
assign mcasp_aclkr = mcasp_aclkx;+ j6 @. q4 p2 J* }4 M1 k8 t
assign mcasp_ahclkr = mcasp_ahclkx;2 }# p& L3 s2 |4 Z
assign axr1 = axr0;
% p$ L6 p" r4 m( l" F
8 g* _& x0 h, K/ X+ K2 ?9 s: d在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 + p! I$ }6 I- ~ G- U' ?: u
static void McASPI2SConfigure(void)
. E: _. \$ N7 Y( r+ Q{
* l+ \9 x! c' ` k5 c2 `, k1 `McASPRxReset(SOC_MCASP_0_CTRL_REGS);
+ _) O- |% o9 wMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
% @$ I0 d1 [3 A6 l- n/ ^" P% dMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);. L: b" T8 D$ z4 _
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */# j& w# e' O4 y
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ M4 D _+ d* s' bMCASP_RX_MODE_DMA);
$ X) Z# A! d; AMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' F- z m! E# Z* K d) D" U1 L
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */4 ^5 ^" k" w8 A* T" }" D1 Z( G
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 4 r$ p7 ~. ?" U0 v/ b
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
' L2 S: ^1 s6 @3 ^$ y, W- HMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, % q2 R; r7 x! c6 a1 N. m w
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
% }5 h* T- e5 ^' C7 h* {8 a* DMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
, O/ U; S/ q/ qMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 0 y* i' H' c2 @3 m
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,# P, W" Y' B; b' y% y' t
0x00, 0xFF); /* configure the clock for transmitter */
' }- _* `; p, lMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);7 M) `0 Y8 [. K3 o# K
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
+ }% x+ D: h& UMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
; X: ~ m" p2 U& A/ b0x00, 0xFF);) S N' |# j0 F, c" C8 s
9 l0 {" x8 Y8 b- ]% E, A9 H. w/* Enable synchronization of RX and TX sections */ ! ^9 {) ` f# N( `# C
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
4 R- T& u2 p C3 U% [McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);6 V1 Q0 N) d5 d L' J
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
* W' X6 k' K4 I9 [- o |** Set the serializers, Currently only one serializer is set as: K m( G/ R: G' S+ y, p3 J, t8 Z
** transmitter and one serializer as receiver.
" ~) w" w" ^# \$ z1 x3 \*/- E0 V( m, v1 b& d+ K0 Z
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);8 l5 [8 Z' o9 t/ u4 e$ r
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*% n }% i E" Z c# v+ K3 ?
** Configure the McASP pins
4 d: r& e6 P/ `4 _** Input - Frame Sync, Clock and Serializer Rx
5 S- R8 |2 H6 |7 ?9 J0 D# x) E** Output - Serializer Tx is connected to the input of the codec / A% A8 y3 }0 ~& j% d
*/5 _- ?# q& B! F# h* n8 \; X0 ^! ]
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
! u) Z5 T U: IMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));/ H$ b" W1 L0 y% a- g4 [
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX/ j! H, w* O9 T8 h2 c0 r3 h& v7 W
| MCASP_PIN_ACLKX5 _* Q* w8 r$ J: P# P& x r
| MCASP_PIN_AHCLKX
# q' U9 H: Z H| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
) B+ G7 X2 y: N0 AMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ; E4 ]7 ~; c) L" G" J" E
| MCASP_TX_CLKFAIL % O) C+ Z$ F7 ~6 l0 ~: s; A
| MCASP_TX_SYNCERROR
1 R7 ~) ]' ^6 f( E) T k| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
) C$ |& ^& e+ \3 j+ z| MCASP_RX_CLKFAIL
8 E+ b2 Y" T3 D: @9 _! s| MCASP_RX_SYNCERROR
6 ^$ ^1 v7 b: M3 p5 ?% u| MCASP_RX_OVERRUN);
1 R; f4 @( v0 \/ ]' i- q5 |} static void I2SDataTxRxActivate(void)
5 M3 \ h6 [' ]: b) F( w+ o{
/ F* d8 j0 f- o& W, A( y" w: ?) i' R/* Start the clocks */
! O1 D Y. m( C' L: o1 qMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
" Z( T* a0 I9 R- K! f8 ~McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
! ~6 X: O5 ? ^' JEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
& P# S+ G( \- l+ ~# CEDMA3_TRIG_MODE_EVENT);
1 D! K' i3 Y2 K5 _1 g& LEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 1 R9 x0 d" y( e8 u V8 `
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
9 f1 F/ p% ~1 L4 k1 M0 z kMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
) X# D% ^+ s* U* E. [3 J) |7 P: MMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */2 F, i' W9 c" p0 L: Y
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
1 L& T/ U3 k6 h) [7 SMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
! j$ X ~! @1 O9 PMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
4 o% M( k6 Y4 G t} . t9 c/ F1 Y% o" T
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. $ n$ I$ X( R' n1 l' G
|