|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,% n9 c- g9 o t ]# K
input mcasp_ahclkx,2 W+ C; d0 o s! E- {7 w
input mcasp_aclkx,
- K) R' k% @: U4 zinput axr0,
, g+ I$ Y; I2 V/ f9 J0 |0 I9 P
3 ]! t9 O0 _3 o! w$ \/ w5 voutput mcasp_afsr,
# Y$ _2 P2 q" T0 youtput mcasp_ahclkr,$ U6 C% Q1 o. S( w) l' ]/ `
output mcasp_aclkr,$ p) \6 @/ `# M4 }! {
output axr1,0 N/ T7 w5 |! a
assign mcasp_afsr = mcasp_afsx;& Y8 H/ w- f2 M; |9 V+ t. o
assign mcasp_aclkr = mcasp_aclkx;
6 g0 E$ [' r& N& O# Eassign mcasp_ahclkr = mcasp_ahclkx;
0 V' {2 W' p' [ `assign axr1 = axr0;
% \- t* a! v6 a& H2 S, i9 G. f9 e5 ], C/ W6 g% Z4 _
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
8 i8 U! s/ O% P Estatic void McASPI2SConfigure(void)& ?. _ G s U4 R! c6 K, x8 W7 ]
{
0 |- w& ^4 O6 a% I5 vMcASPRxReset(SOC_MCASP_0_CTRL_REGS);1 s) I% M7 U% B: O0 m; D
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
' K+ P3 y' A3 rMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); Q9 Q8 E- n$ e
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */' J; G% f+ V: H) ~* u! M
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ Q1 _" }* P4 g
MCASP_RX_MODE_DMA);, v4 u( b, A- z& L) h W- J' u
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# Q# h! E7 C& RMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
: h( c9 W; X: f% u' r) Z- s- L% XMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
9 Y5 ~& K' s6 ?) w5 f6 JMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
2 [$ I w/ N% f8 c$ m! uMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
. f# w2 z5 c- j: XMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
$ w, D* {( }! d' m/ [' G6 fMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
% A t1 j- T! x$ n) z, PMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 3 @- v" X/ v2 @: {# Z: n, W) k4 f
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,6 x( a* a% _1 u# \8 ?( @
0x00, 0xFF); /* configure the clock for transmitter */; J& W* Y6 b/ B: ^- [/ H8 |9 H
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
* q' `; q/ ^5 o0 B8 VMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); / z6 j- O3 @, L3 P) t, c z
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
* U( S4 j& P( c0x00, 0xFF);
* s; N: m$ d/ a' g! v" S6 R- Z, N5 `
# G8 S/ a5 J# k& b6 v/* Enable synchronization of RX and TX sections */ & {1 ?; u. K. H" \2 \0 [
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */3 D6 { |" g6 [
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
1 F4 _# V z2 j6 X1 [4 m$ F& MMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
7 V+ {7 t" w0 R1 E& c6 A** Set the serializers, Currently only one serializer is set as& w) v* p# ?" [: D1 @# h
** transmitter and one serializer as receiver.
4 @. W2 x% \8 O+ Y4 w- _7 \8 F*/
h1 @7 _% |* h4 oMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);8 w" K! u p* ?( Y) @ M
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*# j7 y) g! N9 G: y( Q
** Configure the McASP pins
+ h' ~6 R1 q5 M' C** Input - Frame Sync, Clock and Serializer Rx+ f" h* b' r7 _/ M+ I
** Output - Serializer Tx is connected to the input of the codec
4 @0 W) ~5 s% X- v* p8 b; a*/4 \: O' P- s8 Y1 b; V: m
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
0 M2 x1 Z7 |- l/ g% E6 |McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));* l+ M4 E4 {/ K/ y
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
4 A% s! x7 q) Z. r7 C6 K6 r| MCASP_PIN_ACLKX
+ J& m; p) v# R7 o4 p. B `6 A! v `| MCASP_PIN_AHCLKX
- r5 f5 n7 ?0 D( o3 V' p W| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */4 P; I8 \" F# X, ?# \2 h6 H
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ) y2 }4 B& q5 _/ D; v
| MCASP_TX_CLKFAIL
2 Z- Q9 W9 c/ i* q" M| MCASP_TX_SYNCERROR. i3 b) l$ a" W
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ) i" o1 g7 u& e* T2 l; H
| MCASP_RX_CLKFAIL. V5 U' Z; \) a+ A
| MCASP_RX_SYNCERROR
) W! B2 K' ]- q) c| MCASP_RX_OVERRUN);1 a. q4 f0 L0 [8 i5 ~" i* y! h1 o. }
} static void I2SDataTxRxActivate(void)1 q7 r. i' b* Q. o4 \
{
) ?* n2 f5 B% @6 x/* Start the clocks */* [7 P+ k+ `9 F: F2 t! T
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);$ X8 Q' K$ n, r E/ c
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */1 }; |# V5 a; m7 Y1 D3 ^; \. _
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
$ d& x& b7 L# t) B/ zEDMA3_TRIG_MODE_EVENT);$ g. p4 r$ k# f& A) v
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, & U0 S9 L3 K$ M% r* Z1 i
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
' Q/ n) @+ {- |5 |McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
5 d. U2 b' S1 N! W1 ZMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */7 I9 |- B/ F/ o
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */5 {7 |4 Q* @5 H s/ I
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
N3 r% |- {( h% ?4 j$ Q/ zMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);1 S: m, b3 w5 s& X& a- j: c
} ( A. w2 H5 ~: Q0 O5 t
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. . X- O7 g* c, w) c0 ?! Y. @
|