|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
/ s1 s& }( c6 p3 z2 o: m o$ yinput mcasp_ahclkx,
2 E( k: t# h, |* Pinput mcasp_aclkx,+ x" s9 u4 T& o; e& P/ N
input axr0, c# t- s* r. n4 F1 ~5 D J
6 J T4 V) ]# T2 |& S
output mcasp_afsr,
6 s; h, k" } ?* Ioutput mcasp_ahclkr,
7 D! q, U4 d7 y: b1 Doutput mcasp_aclkr,. x! t) o# ?0 S! X5 k# P
output axr1,9 m/ D, X; z) k! g# a
assign mcasp_afsr = mcasp_afsx;
) ?2 X. l$ l( g2 n. s% sassign mcasp_aclkr = mcasp_aclkx;
, r9 z% ^- ^' g6 z. eassign mcasp_ahclkr = mcasp_ahclkx;: v8 D7 m) f/ Y2 s2 z" `. I; D
assign axr1 = axr0;
/ C; K/ @* E% O; [2 k% P6 B0 V# H! |& R# B
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
( k$ C( t+ h# S P( r! T$ x5 [static void McASPI2SConfigure(void)3 w% p3 u4 \' `$ `. [
{
0 h ~' p# f {! [7 XMcASPRxReset(SOC_MCASP_0_CTRL_REGS);- |) D0 R3 Q) \
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */4 f8 C1 ^ Z2 P' R. R, ^) }0 ^% n
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);" M: R+ Y( F+ m% `
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
2 _* V/ ?' O6 ^McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& r- B% j' v! i
MCASP_RX_MODE_DMA);* A, C5 l3 E* @/ T
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* v, v5 P% t3 {! H- E
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
3 }* g: F/ F! ?3 b/ @2 K) V- kMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 3 f# s" ], F, Q0 \& k( r
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
5 f; M. U1 F; A5 @McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 6 _7 j6 J; F5 y! k2 J
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
1 x2 D2 ^$ k' [1 j0 m) {McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
- A# T/ V9 X/ a% f. w. o4 C- xMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
3 m4 L* x* u5 s5 QMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
3 Y/ z, f; V6 Q% r; d0x00, 0xFF); /* configure the clock for transmitter */
H/ k {7 S9 T. ~3 jMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
! A7 U6 t2 W, c/ h% U0 E" iMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
5 y! V4 n0 m. n- r+ z6 F! @* j) kMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,/ J% F5 r8 p3 ?! J
0x00, 0xFF);0 K" v7 e+ y$ y) k+ R' r; A$ |: G
+ s" y9 J8 K4 _' u/ x) a5 V/* Enable synchronization of RX and TX sections */
% B- ^; d$ O' Z; u% j3 TMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */' t; y8 W# @; S& a+ F! `
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
' @/ o, Q1 C$ I/ }- K& H" tMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
# [8 X' U" g. w. ~( G** Set the serializers, Currently only one serializer is set as
' Z! H! l% B5 K( G! v* _** transmitter and one serializer as receiver.
! X, o( k& J2 n1 ^*/8 M+ ? A- w9 h: Q8 t
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
W+ `% B) J" l" W) ?# AMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
7 k- W3 | O# [7 ?" k7 b4 n** Configure the McASP pins 0 i6 W, s& R( a# q* K
** Input - Frame Sync, Clock and Serializer Rx
8 l, r8 R; k* ]** Output - Serializer Tx is connected to the input of the codec
$ y) P4 I f. t2 ?# d*/
6 R! @9 H- N1 p3 _) W# QMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
3 ~" _2 @# B/ e4 \1 |4 O$ a& IMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
9 o3 w2 A7 C1 OMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX4 U2 M2 I/ w: ~5 [# @
| MCASP_PIN_ACLKX
1 B- _8 Q/ z: R) D, @| MCASP_PIN_AHCLKX8 N7 X$ ^8 U3 B' G( K: p* A, e7 }
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */1 m% R9 | x; u& @7 j
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR * Y; N$ W( w c# w4 v
| MCASP_TX_CLKFAIL
$ _2 X0 Z7 J/ p/ Z| MCASP_TX_SYNCERROR% P7 W8 A" O' X. l5 P U
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR & J2 i B% L. V* G1 W
| MCASP_RX_CLKFAIL
6 G: K) C5 G8 a# }: h9 N1 K- Q| MCASP_RX_SYNCERROR : Z, |! ~' I5 C' `9 ~
| MCASP_RX_OVERRUN);5 y1 d' D7 j9 c; v
} static void I2SDataTxRxActivate(void)& @( x1 H! e: p0 H
{
9 ^& O2 L, [/ l" x& c- J+ a0 X2 Q/* Start the clocks */
2 i7 a# \% g3 w) X) {McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
3 d% _0 @" T; L4 [+ mMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */" l+ J, q. ^* y- `2 C
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,+ R' z2 z" N/ t t) v. m3 l
EDMA3_TRIG_MODE_EVENT);8 X9 s- E [% X8 t6 Y
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
) B3 N* _, [' g. jEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
4 G+ c" K/ P* [2 [8 L7 r _% ZMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
% f* f7 r5 }# f& FMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
9 Z* u2 ?' I1 n9 nwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */& N e. F/ s( l+ n* k* z6 p# m+ f
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
$ Y4 J' |" f8 N' ?7 m* lMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
7 E# G" ?8 Y. ]; R8 \' L7 Z) F, u1 q}
# Z8 a& U3 x- `" | H9 s& u; k请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ' t0 b+ a: |/ {) f) Q% A
|