|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
# _9 l: W8 D1 A2 winput mcasp_ahclkx,
$ o7 i) {+ X; t( i9 Jinput mcasp_aclkx,
* n( L' N9 X0 X3 I Y: Zinput axr0,: D6 c! c; G% }$ L( x# ?$ F; E
* N" Z* f$ ]: S
output mcasp_afsr,$ a! C% A7 n- n, C& @3 i
output mcasp_ahclkr,8 l, @. K/ ~" |
output mcasp_aclkr,% \$ H" v+ S6 U; f5 q4 z1 n
output axr1,
- M1 K0 }0 S1 q# t# m% R/ ]4 Y( B& u! g assign mcasp_afsr = mcasp_afsx;6 t7 V5 e3 U3 d2 R+ n# H7 q1 v
assign mcasp_aclkr = mcasp_aclkx;) g4 {' y5 @' m
assign mcasp_ahclkr = mcasp_ahclkx; P4 z+ |1 p& H6 w l9 L
assign axr1 = axr0; 3 B, W, @3 q. ]( F/ }2 v
, \% P3 { D- v: @0 _% R/ }在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 - F9 `$ M" ?- ?% g( R
static void McASPI2SConfigure(void)& R0 V1 R0 k( P! i& j2 g2 G
{' A- O9 E7 f, }/ ^
McASPRxReset(SOC_MCASP_0_CTRL_REGS);0 e) q! o# ?! _, U
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
/ s/ X$ M7 ^( W+ ]McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
6 R$ z' G* J( T v' n4 c* m3 }McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
* B9 J; P1 u* a" R ZMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 v9 e, ~# @7 d* Q% [
MCASP_RX_MODE_DMA);
" O* W; b9 M5 w y% U4 M2 T0 NMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 B& }5 i& P' r& |9 ~2 E; V VMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */3 M7 h- \) ^0 l6 H ?# T) a
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 5 e% n$ e6 V! ^5 L6 l4 s
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
& d2 M& {5 E$ B& m6 f9 a, p) VMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 2 x6 \7 f# G: `7 K. X, S
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */; K( U$ T. U5 f1 n6 }' S$ N
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);. R/ v, z% X6 q* Z( Y/ G
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
+ Q9 C1 b2 g4 M7 i0 z) u) k sMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,5 o) {+ R3 K6 p( W
0x00, 0xFF); /* configure the clock for transmitter */: F: j" r0 B! }5 ~- ^3 m
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
: [0 ]# h! J! n/ U3 a3 ?& aMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); - B2 [* \# W# }" W9 }) S
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
1 `: o0 a: z) ~4 W' S) {. G0x00, 0xFF);' O& [* z* W- y( u$ v5 E
# ]1 N; f- u& Z
/* Enable synchronization of RX and TX sections */ . u) {3 N# j# j' \8 ^1 X- S
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */9 `2 S7 a& A1 X" G9 W5 y
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
% G; h! z+ W: z2 k% ?& g% C5 ]0 \McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*0 ?3 k! ?/ P* @) N+ `; l( O5 `& I6 D
** Set the serializers, Currently only one serializer is set as$ y! {" H8 m' _2 d- V
** transmitter and one serializer as receiver.
1 }% L3 O1 x- W( f; i*/7 R0 ]# ?0 ?) |
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
. i' R" L" t. Z$ i' b2 yMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*3 m" R$ ?/ G0 U1 b. j* J3 r% L
** Configure the McASP pins
# r' ? n+ C$ a1 i8 e** Input - Frame Sync, Clock and Serializer Rx
' w) ~6 q" m5 |$ j3 V$ {** Output - Serializer Tx is connected to the input of the codec
7 `. t( B @6 ~% f*/
% k, ~, J% p8 w3 l" S. |McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
# X- t$ P' N. y4 m2 e/ D' U2 oMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
4 A. K" l! ?+ W' M2 lMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
& C$ g2 a \3 R$ a# G. A: U| MCASP_PIN_ACLKX9 f/ @3 V8 I* |' Z1 X5 P& h: T
| MCASP_PIN_AHCLKX* N, ^ M$ L" a2 v
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */- T) g3 g1 v' E% i, i
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 3 g, m# h. g: @( N
| MCASP_TX_CLKFAIL ' E7 I/ n( h! f: |+ v
| MCASP_TX_SYNCERROR. s5 ~, w+ w& k8 X
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
5 }' ]: J. c! \! \; x| MCASP_RX_CLKFAIL
9 j& ]1 ^* u9 u| MCASP_RX_SYNCERROR " K! e& E+ l. b }$ g- K6 ]( G6 e
| MCASP_RX_OVERRUN);
( C) C* L! I& l7 K# k( o5 {} static void I2SDataTxRxActivate(void)
$ X- x) w& R/ Z% T* D/ R0 R; e+ Q7 H{
) Q' k5 N5 [! v% L: W9 k$ F4 K/* Start the clocks */
& d0 d. f, w( T" H& b KMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
8 H; \7 M8 v+ x, eMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
. E: H$ ?( [) HEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
1 s: R3 a8 D5 T5 c. z8 mEDMA3_TRIG_MODE_EVENT);- r/ A. l3 v9 r
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
u0 g, z/ ^7 b3 O2 iEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */" z$ k( e0 N% ?* j
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
' C( E% m! K2 ?- uMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */( F' c% p: p* f. L2 l
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */# e) [3 e" J) U! ?3 l6 L- Y# p
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);6 l* B+ Y1 T% W- o, r
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
% b; H/ p( Y. B( U9 \} & `9 k/ |: g/ L- O7 K1 |
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. & P2 `7 ~( a/ }5 D( t
|