|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,! }4 i" a* @. q: \
input mcasp_ahclkx,; W: ?# |* m+ S d# v( p
input mcasp_aclkx,
) f; }% ^2 T, q) q; ainput axr0,8 J; R4 o# v2 d6 M
7 a' ` N% Z( E2 H9 T- ~9 o% ^
output mcasp_afsr,1 @8 F" @4 ~ W6 s
output mcasp_ahclkr,
7 q) Q% _& P; c- \- l! `" Joutput mcasp_aclkr,
. D. X% H' @4 J9 R2 ]3 g8 m" ?! ioutput axr1,
6 `+ L2 R1 b% e K5 r( } assign mcasp_afsr = mcasp_afsx;! O5 v7 }/ u& ]' f: o
assign mcasp_aclkr = mcasp_aclkx;
; ~, ], f& S9 @assign mcasp_ahclkr = mcasp_ahclkx;! O9 M2 c; w: g
assign axr1 = axr0; 4 l( v/ F" \+ _" ]* G8 @0 T
8 C$ {1 q% X& S& }/ O
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
! Y9 b' R4 N- c& m0 X# Cstatic void McASPI2SConfigure(void)$ O( x; B- a" ~: C/ p5 H. H
{
- @( V ^* H( C* w' w2 uMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
E# `. @) V- j0 [McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
/ P' O3 |' Q8 x4 s! p0 D8 \McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/ ?# M$ v' y" k* [+ v( XMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */- p0 `. B$ ?& q0 K+ z
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,% m% \& R$ ]# [* \( U
MCASP_RX_MODE_DMA);
4 X, p/ F+ D Q Q4 wMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; g6 p( f* a4 K; b! _
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
; S6 V1 q7 u& n8 T! r: d2 J' E; gMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
/ J% k* E" K8 K8 ^0 r7 o3 ^5 ^MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
0 @0 |7 A+ }; B/ @9 SMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
. i1 a$ a, q) j) S& d' jMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
& S0 p2 R! U1 {! H( [. F0 x" o* m* kMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
0 a; {9 k0 Z d3 a. l- KMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 3 k. {* I7 c. l1 E: m8 V: @
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
3 u' j( i6 ]4 e0x00, 0xFF); /* configure the clock for transmitter */1 f6 A- n: D7 n, z! x& r, U
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);. }- V- g! |# O- |( \) ^" E' |
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ( j/ |1 o/ b S2 y
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,& m0 u( S' [/ }( W- a& R
0x00, 0xFF);" J7 U4 a2 P- l- |1 i @. T
( z* s# I' _9 Q: ]( E1 t5 N; C
/* Enable synchronization of RX and TX sections */ $ W1 ?4 C+ }& y/ G
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
' T, n: B4 C% |$ MMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
: k. n. [( `1 N% KMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*5 E* a% L6 F+ x. {* [6 n* v
** Set the serializers, Currently only one serializer is set as8 ~& B0 B% G4 B+ ?& D3 Q1 Z
** transmitter and one serializer as receiver.1 H- B" Y7 S; B' ^% Z
*/
+ c' L8 T* @0 @& f( WMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
, C k# j2 w% Q0 H. VMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*6 ]8 V5 x3 |% Q
** Configure the McASP pins + F2 p& [6 [( [8 U
** Input - Frame Sync, Clock and Serializer Rx/ }) O! ]% v7 {* }7 \* s
** Output - Serializer Tx is connected to the input of the codec
& k" e" H- x# J; X- v+ F*/: l5 f9 R: |8 E. U' M8 w
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
4 X& v# }$ p9 a9 z5 U' _+ {McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));) W8 o. E; M$ E5 x2 ^
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
& E9 U8 c, @: x| MCASP_PIN_ACLKX
6 W( D4 {9 j6 C/ ^; r| MCASP_PIN_AHCLKX
* v) y7 R8 e$ A! M }3 G. X) _| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
/ m/ T* |5 ^9 k/ q3 D5 }McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 4 A) f/ b& |# v3 X! c
| MCASP_TX_CLKFAIL
6 ]" g0 u4 @ \$ m. F& s| MCASP_TX_SYNCERROR
/ _% C ]: U( T2 X1 a| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR : r6 M; }' ~3 k4 f1 G8 ]$ {
| MCASP_RX_CLKFAIL
5 T* {: @2 b- v# K& Q3 p| MCASP_RX_SYNCERROR
; t0 P! P( I8 \, h: m9 F' V| MCASP_RX_OVERRUN);% H% r2 } X4 V& N3 a: f3 X& s
} static void I2SDataTxRxActivate(void)
: d5 }; A4 |2 K+ Y1 s0 ?{" z! M" {7 K* i; U s" ?. S Q! ?
/* Start the clocks */* `' C" `2 u' H
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
# s& y5 F/ z* [, @& ZMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
. m/ B+ d0 Z) f% X+ zEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,2 X+ @9 h' n9 h: ~) g: y+ ^
EDMA3_TRIG_MODE_EVENT);
# w6 o Q% k7 M# L4 j: ]3 e- eEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
- c& D) Y0 E9 X! s' o' e7 `; O1 IEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
% x& K" H7 r7 T; a: u# j2 ~McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);7 K# K- S+ r. l
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
9 V* v" D# E1 N8 N# f9 O; ?while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
( [2 }9 y6 P6 YMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
$ u3 v+ h% K3 F$ _; IMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
4 f3 e, R6 @+ |, \} 6 c2 A) Z% c' ~; q7 s% u" p4 |5 y
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
* Q0 W& V! i( E( ?' y |