|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,: O1 z& Q* D/ q0 P& C# `
input mcasp_ahclkx,. I! T/ G& N2 V* \7 ~5 K& [( `
input mcasp_aclkx,
8 c, T4 q+ G# T& ~input axr0,
m1 J; W) b# H- @2 ]
5 Y6 ~# \5 P) l6 goutput mcasp_afsr,
0 }, ~0 A- c! }: W0 v7 l4 I) I, Houtput mcasp_ahclkr,
8 A; X8 j& ~+ l- s- ]output mcasp_aclkr,% w3 w9 B% P; Q/ @- G' h* \: P! b* y# \
output axr1,! p/ h Z: E( ?. F
assign mcasp_afsr = mcasp_afsx;
8 e3 Y8 v( g# m( g9 w8 i3 b% |, o. yassign mcasp_aclkr = mcasp_aclkx;- T1 U0 F) [) b, o) A
assign mcasp_ahclkr = mcasp_ahclkx;
9 y* |3 g* V; S k) T0 C: tassign axr1 = axr0; + x% I4 L$ B, x
' w: j" W4 _* R; B/ F6 r
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 / i2 ~" m8 w. [/ L. E9 P. R+ Q
static void McASPI2SConfigure(void)
% l) y1 h2 k3 p0 |( o/ j: ?" K{
$ x. b" P j0 D+ ^% N' ^3 ^McASPRxReset(SOC_MCASP_0_CTRL_REGS);
8 z/ S5 d4 i d% y1 h1 V. E9 DMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
4 H" c0 Y% f) W0 U, TMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);3 Y& R; O1 p# ?3 R! ]3 a6 @
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */# C/ w; _* G3 c6 w
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. O& W& s6 K, k, M5 GMCASP_RX_MODE_DMA);( G. U* Y. O. E4 z
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ `% T- b" z8 P1 ZMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
5 N7 Z$ |/ R) e! I3 FMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
8 o# B& c8 v4 W' K/ |/ [- h5 qMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);8 ~' w9 Y, b$ J, }; {, n) t
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, * x5 S2 f) ?5 `5 E
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
/ y1 | y9 N: _9 AMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
2 v/ |$ J" P& U _McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
% A& u! r e3 ], ]% b KMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
& s- O5 b; v; t0x00, 0xFF); /* configure the clock for transmitter */
5 l+ Z' S* x1 {, e+ qMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
( _& Z+ M. r0 O' bMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 8 b7 A) `# d% E. l2 o/ }; i
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,/ g ?" r; u' R$ a: k2 \- C
0x00, 0xFF);$ W, j) V6 C2 _" F& ^
% Y m; M3 m" I% b. F9 b5 r, W/* Enable synchronization of RX and TX sections */ # Z; g/ O7 d" g$ I+ L* G6 n
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */3 a f" E6 |; G. N. o2 N; M
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
- _ o5 P! O+ S, P; m7 E& ~McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
4 P$ Y3 V7 k, e' P9 e) I** Set the serializers, Currently only one serializer is set as% m9 r; m, V Y4 y4 y4 X* ]+ W7 L
** transmitter and one serializer as receiver.$ x0 `9 q. x7 \. x
*/! Z4 _; Y1 x, Y0 e- I
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
^6 A8 [1 F+ r6 \: V& QMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*$ g. k/ j; U0 Y$ d; i; X a0 W) b
** Configure the McASP pins
0 d3 s( X- K4 b" W% Y* {** Input - Frame Sync, Clock and Serializer Rx7 C O$ L3 e1 r# x
** Output - Serializer Tx is connected to the input of the codec
8 [# v n9 m/ ?4 M9 _/ M7 ^* N4 g*/- X" l# _9 @) L, i
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
( ]; Y3 N4 x6 t; MMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
! ~. P4 u8 s( B3 e3 ? vMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
& c8 {; z2 {; E8 D7 Y5 Z! @" @| MCASP_PIN_ACLKX
* C/ I/ |. T$ ^; Q% C; G| MCASP_PIN_AHCLKX) f- Y& i. Q4 t
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */# M* M& ` a3 P
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
3 Y& ]- f$ ?! Y8 |% W9 V; D| MCASP_TX_CLKFAIL
5 A: B! H% k$ }. R4 z. I+ E| MCASP_TX_SYNCERROR
2 P$ ~, H& k, k, m! x| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
( W: i: } h- f. S$ || MCASP_RX_CLKFAIL
& k0 q! ~" u: m7 R6 i! h _5 P) G. R| MCASP_RX_SYNCERROR ' ~, T0 E0 X: H( |
| MCASP_RX_OVERRUN);6 K! l- x* h) j- t9 W' k. n" Z" i. ?
} static void I2SDataTxRxActivate(void)
5 w, T/ Z0 S, l- @! b! u1 ^' i9 u7 d{# Q" Z* S7 M; P8 m# A
/* Start the clocks */
. P: |9 k9 F6 d) G" BMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);9 L6 M( O6 Q/ E Z# @" ^8 z* }. W+ B
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer *// j9 P+ I- R) g( i" V: G- L
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,. ?6 N) I+ K) ]9 I- {
EDMA3_TRIG_MODE_EVENT);" H2 g3 A' o+ Z2 y8 @8 F7 u2 l2 [
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
' m- I/ b# f; x+ v/ {EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */( n3 c P7 w4 Z% ?( P0 ?
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
8 H* N/ [) @) {/ sMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */9 o) b9 Z/ I0 O) a Q& N1 L2 R5 @$ b( V
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
5 v* f O: @. j* [+ S: EMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
1 T' [9 \+ o, s2 D# s _McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
& a# T/ t6 O, b3 |}
4 u- F/ {3 {' Z3 c" _$ J请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
! J" Y+ M8 u" h# v! J |