|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,9 j. x* ]" V/ F" z0 o1 q4 j
input mcasp_ahclkx,. I: C# l; E/ f3 M) W
input mcasp_aclkx,9 E ]) J6 S4 X. U0 `9 I
input axr0,
* [2 s9 _# P7 `6 a6 |2 t9 ]) s9 {5 e& [% g4 c8 ?" i1 e7 T( Z5 z
output mcasp_afsr,/ l0 T: N: }: j* }/ f3 u9 K
output mcasp_ahclkr,
( }4 @! o' }. V3 R( }7 koutput mcasp_aclkr,# y. a b$ n5 c2 w: Q, w
output axr1,) t: F1 s/ |+ P( f6 Y
assign mcasp_afsr = mcasp_afsx;1 x: @- e+ L' m
assign mcasp_aclkr = mcasp_aclkx;, H/ G. T) ], L+ r6 X) F
assign mcasp_ahclkr = mcasp_ahclkx;% ]6 l+ Y ~: U; i8 A9 v: }) h
assign axr1 = axr0;
" D+ T1 l: I* o5 Z7 N9 t f9 H1 l' s
( q" x, b$ y5 u% E' `7 e在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 6 z+ G: f! {* ^) V' r2 u
static void McASPI2SConfigure(void)$ |/ N- b! s& W' ]) a
{
3 s- c* X0 ]" q8 o O* HMcASPRxReset(SOC_MCASP_0_CTRL_REGS);0 m' e% p- {, r& t, H; f& A5 H
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */5 `& V @8 D# ^* s$ I3 P
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
3 e5 k2 m/ m+ m) ]* n W' t, ?McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */9 l6 Y) ] \ I0 j
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,4 F( T+ c3 ~; b$ d" s
MCASP_RX_MODE_DMA);
6 |1 G5 J4 O* `4 d% q" H# TMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 X: N: U3 Q. G
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */; Z3 u, I% v) W d- |
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
+ f9 |1 g6 S- ?MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);# D$ _1 }* E% B' L
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 8 }1 ^4 [3 x7 R1 @! |& z! P/ U
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
; }/ a% f& W" t& W& j# |6 D" A: [McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
) x3 H, Z/ e$ y- N2 i2 ]! SMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
/ x: i5 n0 x( J% hMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,0 h# P1 i) O9 v9 l, ]" A' c
0x00, 0xFF); /* configure the clock for transmitter */8 t6 t6 Y6 n& Y- j
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);2 s# ?( t( J" K. P0 z3 N
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
! M3 C% H+ C7 D sMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,* B1 r4 t. x% c4 b# ~4 E7 U
0x00, 0xFF);; m% b1 Y9 z2 A3 p
; X8 p. @$ l% E$ D& D" y! g/* Enable synchronization of RX and TX sections */ 4 y6 O t3 _( Y# b# d5 x% s% m$ |
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
, C$ g8 K; {4 ]2 B ^5 \. JMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
3 }% z( ~4 ?5 W6 R8 B5 `McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
5 f |6 {" X8 y6 }8 H1 ?** Set the serializers, Currently only one serializer is set as/ I( p) A' \- S% Y
** transmitter and one serializer as receiver.
f4 U5 m( K5 e V*/
! n, Z3 _: b8 b. B% j/ a2 a2 g3 nMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);7 b7 j! x0 k7 l) y5 j# H$ e
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
. h8 u& ^) a' ?! G** Configure the McASP pins & n0 s& l* \3 |! ~
** Input - Frame Sync, Clock and Serializer Rx
3 {2 R0 z' q+ H! b8 Z4 ], _1 {** Output - Serializer Tx is connected to the input of the codec ! |+ |2 }: Q% C& e/ r% L8 v
*/
# F0 Q7 t1 S, b% Y' M8 GMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);* I# n/ L' _0 q9 h
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
J5 A0 c$ U( h: ^: w8 gMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
* X% j5 j u7 S# C* a D/ `$ \% r| MCASP_PIN_ACLKX
8 W0 p, O( l4 x8 k5 R# A0 j| MCASP_PIN_AHCLKX
/ W5 o. Q0 E2 `4 J/ T| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */$ O$ G0 X& {5 C
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ! F8 N* _! i$ C1 H8 ]8 ^/ w
| MCASP_TX_CLKFAIL / A2 R% w" P" a& }5 x3 a
| MCASP_TX_SYNCERROR X/ ]- z) O3 y- M. Y
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR : B; e1 ?& k. y9 \! W3 G/ j) ]' h
| MCASP_RX_CLKFAIL
3 S8 H* s5 [( V0 ]" I% ~4 G| MCASP_RX_SYNCERROR $ X# R, L4 u2 o8 J" q
| MCASP_RX_OVERRUN);( L+ t+ X+ P4 F+ S7 c1 ^4 Y
} static void I2SDataTxRxActivate(void)/ |# }' \( p$ s6 G, F6 y& J4 {
{
. U8 v0 x6 J2 j$ j/* Start the clocks */
# Y0 n( F, I: zMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);. ~! R) c/ s2 ~7 S0 D5 B& D
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */1 I" T, E% g- S- T4 u( E. ^' X4 c
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,% j# L& n# f2 @0 W. X2 e6 `! C% V
EDMA3_TRIG_MODE_EVENT);
+ b4 K; l/ ]# w2 d, WEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
* B" I% P% D: }5 tEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */1 R# y* U/ ?$ t5 n7 g- V4 [
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);* w V0 X6 W( P" {
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */: ]' H5 {1 a$ U% t0 B9 k" Z4 ~
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */- w5 Z' F$ X3 a8 n8 j; Y1 b2 Y Y
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);0 p# l5 G' R o
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
3 o: T# i+ X6 r1 _/ V}
# k" ]) _0 B2 D' }# h请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 5 X( h$ S; }6 W" t
|