我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
' B* r+ W# D- {8 o) c3 Jinput mcasp_ahclkx,
! Q$ r4 k5 N4 a5 m4 a% Pinput mcasp_aclkx,
8 @" ?! p+ T( Finput axr0,
: C. y) _2 E9 o' i( ]0 M+ Z0 M5 L5 u- P
output mcasp_afsr,4 {5 x$ T9 d5 e4 F
output mcasp_ahclkr,' z( a8 u5 Q3 } D7 v0 V; K& M, g
output mcasp_aclkr,$ Y! p5 i+ b" x/ |
output axr1," Y& @+ H' t, i9 k% D$ M! I4 [
assign mcasp_afsr = mcasp_afsx;
6 i8 a: r7 Y F& V3 X! e; tassign mcasp_aclkr = mcasp_aclkx;, w. ~" A( }0 R. @1 s
assign mcasp_ahclkr = mcasp_ahclkx;% e! i0 D! g7 f6 n$ T; u1 S
assign axr1 = axr0; 4 S: s% e+ ^7 c# m; \8 |5 R0 M
, w7 Y, O/ b" r
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ; g. f1 K3 E) @1 Q* W, V/ Y* x
static void McASPI2SConfigure(void)' g" J; O5 E& v% x
{
. p+ d2 D- |; bMcASPRxReset(SOC_MCASP_0_CTRL_REGS); C0 F0 S- u: e/ s( k
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */( K, f2 ]' I* y; g \* k, [/ X3 b, _
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);! A! l: I% I/ V! {3 \+ f
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
9 A( ^6 k9 k' ^, J& B1 z* W ]McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
' C+ t+ u& [, y4 lMCASP_RX_MODE_DMA);
: Y. l4 `. N! T6 ?$ [McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! N# H2 W4 [4 d# l, U) |, R
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */* {; C6 ~) |/ Y! A' W9 s
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 6 f$ v+ R/ y" m! X5 J" i: u, J" C! U$ ~
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);! ^7 V. [7 t: O0 `
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
. w* n* J# d+ b3 H. _% g! hMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
" k$ z' ]# B7 [+ t. m3 |0 z/ B+ HMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);- l5 {! q0 ?& R4 j% o
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
4 g/ U$ A! O' O4 {McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
, j1 S5 P* N' v; P0x00, 0xFF); /* configure the clock for transmitter */
& c2 ]" _5 o- D) }McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
c* o1 W, P, ~# W1 U. NMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
$ M: P: k$ E) e& F4 uMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,! ^7 j, O$ M4 ?- q
0x00, 0xFF);
2 H* ~4 @3 F) T) p# }2 V* r
* l( A$ S) [# A$ Q' h7 i8 s/* Enable synchronization of RX and TX sections */
) w6 Z1 d. E" WMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
' k$ u; A. w, p% `8 Z8 dMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
( ~6 ]) k8 |0 b) P! {McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
2 A8 ~6 e4 D4 C/ T+ n, j0 T** Set the serializers, Currently only one serializer is set as
3 l$ L1 }+ e& G* A$ i** transmitter and one serializer as receiver.& p% ~% G+ k+ z
*// z, z$ K: A: G! s7 M
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);) f/ v; e, T Y/ |4 L
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
# W( H! J6 m/ e2 V** Configure the McASP pins + e5 I% K: p, m+ B1 }
** Input - Frame Sync, Clock and Serializer Rx
# z9 t* Q9 T5 f; A** Output - Serializer Tx is connected to the input of the codec ) D- x5 _' }; P7 d5 W& }8 k
*/- J- h: ~* U9 s1 J) q/ ^
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);( ]- U3 \ J" o* n
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));" B3 }9 d# F) [, c+ g
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX6 W4 v. @' r! `0 D
| MCASP_PIN_ACLKX, |& d* m% v, y2 m
| MCASP_PIN_AHCLKX8 g7 y8 B k7 ?3 `" R, c
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
$ o6 x F) M" w* z9 T R) d3 }' BMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
. X# Q. n' g% u) V4 U| MCASP_TX_CLKFAIL ! M) g) v6 k4 H3 F$ [9 l
| MCASP_TX_SYNCERROR( c y) F b, @7 r- ?
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
4 R+ f# W% W- H# S; r8 h| MCASP_RX_CLKFAIL
* M. J$ J1 I) P P2 e' p+ O) H1 k/ Q| MCASP_RX_SYNCERROR
4 k% Y, V- }: q2 |/ a+ h2 G| MCASP_RX_OVERRUN);; W/ v2 E) B% f: x
} static void I2SDataTxRxActivate(void)
8 `$ _4 r! d( i+ J- j. o* i A{
j8 a, d4 S J$ ^+ M1 V3 I/* Start the clocks */
, P% Z4 K& n* @. l" ?! rMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
* C) `9 A9 N5 j7 KMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
& `3 U8 k! J, `% C$ UEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
+ @; \6 T8 [# E* v v. Z/ c) XEDMA3_TRIG_MODE_EVENT);
* [8 R: ?" Q, b W' wEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 2 T( Q, H S+ r" K4 d
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */* j* M& j; v2 l
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);& V0 G+ s9 G R1 H2 J1 q. \" ?) X* X
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */* J1 g5 L" k( y6 \4 C5 x& n
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */3 ]4 A6 q4 S$ l
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
* d: S% n" D3 G2 \McASPTxEnable(SOC_MCASP_0_CTRL_REGS);- M9 H) M0 b& K2 o
} % C4 F, R( s8 M0 \& i3 A) M. k
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. - ]5 ^6 H2 o" N% J3 a% a
|