|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
4 L& O6 T$ r+ Y3 zinput mcasp_ahclkx,% t9 E' K9 }; ~2 M) f
input mcasp_aclkx,
' G* m4 M. x! c1 k! U" N' xinput axr0,5 P6 s5 t+ t, ^$ b
, ^, j0 |: k/ A! Q5 Q$ u4 |output mcasp_afsr,4 W/ r5 A6 G. t- `2 j6 g
output mcasp_ahclkr,, V% _% E, n4 h* R- W
output mcasp_aclkr,
0 D" a& ]1 v2 k0 ]) p0 Woutput axr1,
& C9 x. [4 w: s/ r1 F assign mcasp_afsr = mcasp_afsx;
! W; e G4 j! m1 J Bassign mcasp_aclkr = mcasp_aclkx;
; {7 q+ O9 i* G- m/ }0 j' Wassign mcasp_ahclkr = mcasp_ahclkx;$ N1 G* c/ A4 w- J j
assign axr1 = axr0;
. |% ~8 {& j4 X/ C
! ~/ s" n7 C1 Q5 a" K( H. |在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 7 u5 C' m& t9 b& M6 ?! X. `+ C
static void McASPI2SConfigure(void)
+ c% s5 U$ q! k{+ m2 J& z; U; o* u
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
, s& O& B0 i: c( ]7 ^9 iMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
W/ z$ N" b; y* ~* Y0 QMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
* x/ L$ I9 f* sMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
! j! f3 H' D. \; e TMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 B; A6 X. B4 N( U3 Y3 T! [, ~
MCASP_RX_MODE_DMA);
4 ^ B. n8 J: N9 w9 z' QMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* k0 O$ p: N6 V1 g$ M
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */& E2 }) O) D/ f7 A- J
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
+ M$ L c) v2 n+ S, T+ W& WMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
- n4 | A* O. f$ C" s. E& }McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 3 X4 t4 y) t3 A$ _
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */. G8 a: L1 b1 O$ l' M# s; ^1 _
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);" K* e" F7 M# w" Y) o8 b* T
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 9 J2 F1 V; o& o8 ]3 F, L8 Y
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,, e0 V# ~6 b, A2 C9 f# H$ Y
0x00, 0xFF); /* configure the clock for transmitter */
& T* {) o7 ]& Z" y( [McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);' H& e/ w5 u( I" j8 w# j
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
9 e( d1 Y. s- M+ d9 d( NMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,; U3 K% U+ N5 \! V2 N
0x00, 0xFF);$ E5 Y4 M V% ]1 `# y
* ?) F4 C) _2 c I& E/* Enable synchronization of RX and TX sections */ 7 p, w7 y5 r8 e# N% W* R1 ^* s
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */! O. T7 M6 K8 Z3 l4 ]% j9 G
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);# Y: p% ]( x d
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*$ l) j8 C6 ]( Q: e
** Set the serializers, Currently only one serializer is set as
; k! x$ N5 C) h; d** transmitter and one serializer as receiver.* W) C9 C$ ^% y" P! V
*/
& N T; T, }5 y- R W7 ]: u$ f9 KMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);( F) C' h5 A+ ?% f8 i, [4 X
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*9 d1 Q! X0 P6 r/ u, V! m9 e8 x
** Configure the McASP pins
& I) I2 v, l6 d0 r% I" f** Input - Frame Sync, Clock and Serializer Rx
+ A# ^( D! `! ^6 Q1 c** Output - Serializer Tx is connected to the input of the codec $ w8 X' \1 {5 @& [( [6 \! f4 F
*/
$ [; W& ^) V$ @# gMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);% Q3 e& R: G: e5 r, X
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));; Z4 _6 e* G) i" V) ^
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX8 a' I+ y0 ^* l7 I
| MCASP_PIN_ACLKX. J4 ]7 `8 ^ ?6 X0 c
| MCASP_PIN_AHCLKX
2 X; i3 Q7 g. D| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
; N% {7 W% S9 s8 fMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ) W( ^! v& J2 X5 r/ b
| MCASP_TX_CLKFAIL + p& d: _* _; W+ z$ l8 {, b( T# f
| MCASP_TX_SYNCERROR
- b6 H1 A ]) I! i, \| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ( \# f4 t0 L' \" o, Q1 ~# i7 T7 N8 D g
| MCASP_RX_CLKFAIL- w" v0 @/ F* F# B' v/ `, d2 v
| MCASP_RX_SYNCERROR : }% @) E% W- ?' ?& }( v- t1 k( r
| MCASP_RX_OVERRUN);, D* [5 y8 \$ f+ K0 q% @4 l
} static void I2SDataTxRxActivate(void)5 X) N5 l* u! D! K
{) `* A( z$ ]$ M5 J3 F( Q) O
/* Start the clocks */
+ c# Z# h; f9 P7 r6 _6 {" AMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);$ z( Q2 q& k. E2 O
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
; }6 Z- _ y( o/ u6 K5 R3 n2 VEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
$ d+ K) T% N0 HEDMA3_TRIG_MODE_EVENT);5 d8 {/ m/ e# U! Z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 7 X0 T0 e9 n( P3 {7 Q* a4 q& B
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */; q1 ?# Q( { f% L3 V- ^
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
/ a: f5 s; H& GMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
$ G6 f: |% ?1 w+ E1 i. U: m. owhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */& X4 {$ p% L$ h w* u1 h
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);6 {+ K& {' i% e8 L8 v
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);9 j6 y) g/ M5 _7 f
} & T( y& j$ D& t6 r0 N6 z
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
* f3 b% |& N& A) K- L( g |