|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,% E" U1 l+ m b9 M4 B6 x' p9 M
input mcasp_ahclkx,
1 b5 A: |! O' W" s6 N- q0 dinput mcasp_aclkx,
4 O8 V1 B% \- t. O3 winput axr0,0 H Q) ~& ?# P5 R( m& ]7 L
. x9 z4 ^( i; }
output mcasp_afsr,
+ E, J2 x- ^6 Z) Ooutput mcasp_ahclkr,# `+ r' G% Y; [5 X9 U
output mcasp_aclkr,5 p- \6 {! U, i' f( Q/ S
output axr1,2 m& v& x k" z+ {; `# F
assign mcasp_afsr = mcasp_afsx;5 Q8 ]- b. q, H% A8 L) k" s2 ~
assign mcasp_aclkr = mcasp_aclkx;3 @: P7 T6 L; {# ?& l. e
assign mcasp_ahclkr = mcasp_ahclkx;# Y' g1 \* N% v
assign axr1 = axr0;
9 z8 `7 G4 H+ b0 b9 r& q W
* ]$ E+ k$ M6 M2 I$ c3 D在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
6 {% a" z6 t9 s$ bstatic void McASPI2SConfigure(void)/ V- J$ s$ X+ |# ~9 a' R' l
{
2 ~% F1 g3 |! P9 E5 Z! b$ qMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
# k) b5 P8 J2 Z) C, n3 DMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
+ a" R( e/ n& ~9 u: pMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);. }* Z5 n8 h. `5 r
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
4 u6 n8 L. d$ xMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# C" U8 F" s3 e, C( t/ ~MCASP_RX_MODE_DMA);* C( Q8 ?. V! m6 a+ d7 g6 p
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,5 c' m7 b+ K) U [- d% F/ n
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */ b$ Q7 e0 f% l
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 9 N' y1 Y0 l# z
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);6 C: J" N, H5 |
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, K$ T+ ?# ^ a* o6 C) ~
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
- F0 H- Z. Z E& u# X# f0 FMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);/ d4 k- t7 |! H8 b
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
/ c4 b7 `6 X6 F+ D6 nMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,% u; Y: l- }0 P+ M
0x00, 0xFF); /* configure the clock for transmitter */4 H; c- q9 o, ]9 Y
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);$ I6 D3 {0 G8 c$ q* m
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 0 m, b1 L( s- @3 {# g8 P+ s L
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32, H( |# i% I, w2 ?
0x00, 0xFF);9 Y g5 k$ |9 i8 W
* {9 j2 I# f' k* T/* Enable synchronization of RX and TX sections */
# s& p4 j6 B V! u7 {) IMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
2 O+ \: \$ c5 B, {( _. n3 Y- HMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
0 R+ c# T2 A$ |# \& X. \McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
2 y7 e! S1 K z* k4 O) I# ^7 v** Set the serializers, Currently only one serializer is set as6 a0 P) T8 F, o2 `2 N' }( o7 w
** transmitter and one serializer as receiver.% _4 ?/ N1 V( h+ p5 X8 c
*/
9 V# P8 ?9 D, @( d& J' n5 jMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
' C1 _. Z4 y( b* p9 T; C, N; Q/ AMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*$ s( i6 t0 W& F& [ T
** Configure the McASP pins
o0 t- S' V$ L/ @7 M# m; B** Input - Frame Sync, Clock and Serializer Rx. l9 j1 j* z7 y% Y9 k; ~
** Output - Serializer Tx is connected to the input of the codec
& g) p# G9 B3 v( a: q5 d*/( a. R0 s; z" Z+ ?
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
# [# c i" I; A9 WMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
4 K7 P3 z6 S% \2 v; Y3 JMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX) T: e; p; v1 `
| MCASP_PIN_ACLKX0 k; d0 M) V, ]
| MCASP_PIN_AHCLKX0 w8 T" g* }' i% V
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */! T& L5 Q3 a9 G) e* t2 ^# F
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
. h+ c* x: @' c: ]) ~3 K% L| MCASP_TX_CLKFAIL 6 B3 w6 ?- F- V6 _/ G
| MCASP_TX_SYNCERROR. H- U$ r+ u! O0 R
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
0 Y! d4 U2 j8 F F( Y+ V n| MCASP_RX_CLKFAIL
' L+ }9 q+ F8 p) ]- t| MCASP_RX_SYNCERROR
, w4 Z7 K0 T l: `| MCASP_RX_OVERRUN); @. T ]8 S+ [2 b1 {9 E4 J, W) x
} static void I2SDataTxRxActivate(void)
* \. E4 l- C3 P- D* p) s{
( a, j8 [, L! Y8 `- W$ U/* Start the clocks */
/ e9 o P4 `, ^5 BMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
& f+ ?, W+ w* j0 \$ m0 [ u2 }McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */1 M; W+ S1 B b5 B
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,' m: v$ P* x$ E; L9 n6 D
EDMA3_TRIG_MODE_EVENT);) l g2 G; W u9 j/ i
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
$ g- l& X2 |: Q8 K! Y, {EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */' M( k6 q0 N- O
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);- M, ? ^$ c0 [, \( |, n8 q$ }
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
! W9 B3 o- m) vwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
# f' x3 `( ~6 h3 R6 \- L9 rMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);. x/ _. ^( e# Y( X N$ {' S$ J
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);% R( z# x0 s q6 t4 Q' Q
}
9 j- |+ P" f* a A请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
+ K) E4 c& C9 V+ x+ K9 e8 W |