|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
# E4 F, k7 S8 l6 @input mcasp_ahclkx,
9 R) t6 g/ W/ ?input mcasp_aclkx,
' \5 m8 S) j) I2 B( n$ linput axr0,* p9 _* Y, x8 ^7 J
& t! E! m3 I q' B, ooutput mcasp_afsr,* b' Y J+ I' p* [/ ?$ y1 D
output mcasp_ahclkr,
9 z+ ~0 t0 j& S, D$ C+ [7 [) _output mcasp_aclkr,% b: A5 b( }1 _8 T
output axr1,0 `4 h, H" o) |
assign mcasp_afsr = mcasp_afsx;
3 f4 x; g# w- `9 t1 j3 @assign mcasp_aclkr = mcasp_aclkx;+ r) l$ p; q1 w5 l% @: [
assign mcasp_ahclkr = mcasp_ahclkx;9 d/ S( v/ z6 g: ^; P
assign axr1 = axr0;
u* m* N" T6 a4 t3 j5 y4 E: u, k1 F' q/ t
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ; E0 {- J/ ~7 Y4 Z1 c
static void McASPI2SConfigure(void)
7 v* j3 f( y G* q+ ^0 Q4 Z8 q{8 X+ k4 ^ q9 G5 o6 }( u5 S% M
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
, k/ c* r5 I' J J0 I J. y0 m" z( WMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */4 \4 l u" P# u. Y; c6 Q
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
' E" \; g# Q" l+ ? CMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
# ~0 S3 u; \2 V) x5 V& u; P. rMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 m8 O. e, _; }, O
MCASP_RX_MODE_DMA);
e& C9 t1 A; [& eMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
P! v+ r6 z, v& Y6 W9 S/ g8 o3 Z! QMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
/ ]# |& d6 h, M! m: Q8 K C1 yMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, & b& F& @- r% l; g5 ]
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);! I# G: Q X6 k/ R* p* h
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
# i# r6 ~. H' ~* g+ X! KMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */% d+ p9 h3 e- u2 m+ }
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
. S; A, M. j1 P, R8 p" RMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
4 s& S! q E1 Z8 Q- FMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
$ I. Z" E* N( P) D# w: l$ ~6 r2 D0x00, 0xFF); /* configure the clock for transmitter */
; t3 [ B7 x% }/ hMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);6 F" k! T& R: ]# X3 l
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); _; k/ w2 B U# Q5 `, @
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
0 [ l. G+ F, I1 n0 l& p' Y2 d0x00, 0xFF);
7 y4 |6 M! \; _6 n0 Q% ^; Y
% `( V# ]' P5 [9 W+ \3 h/* Enable synchronization of RX and TX sections */
' o. D# E. _ z* t! S/ TMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */1 w2 {$ K( V& P) ^
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
: Q8 r+ q8 c. PMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*) O% H4 r& h, i+ }. R4 b" _
** Set the serializers, Currently only one serializer is set as# E! y3 `4 y- }, l7 D
** transmitter and one serializer as receiver.
% l- G, g# {* p*/
+ T# r! {% }" h) ~McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);: \4 R/ F7 K/ [. M/ o# Q& T3 x# c; ]9 X
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
' L8 [+ B& w; x4 k* y' z" z) P** Configure the McASP pins
$ F; L% m2 f4 z* |* m& S( c** Input - Frame Sync, Clock and Serializer Rx
- n( F. d' s& L4 L5 u$ e** Output - Serializer Tx is connected to the input of the codec ( }" |9 d: v X- `9 V
*/; E% X' d3 ]- e* n
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);: W+ i9 I6 R, E5 p
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
# I7 f/ z7 C9 nMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
( d( S+ t% L7 N u| MCASP_PIN_ACLKX
6 {% t2 n$ O' Q) t9 y- H0 B; M| MCASP_PIN_AHCLKX
( w" t# |* j& @: j `7 l: h5 O| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
& D; C( {) x& Q) } pMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
6 \6 T6 f! m$ @* Y2 D| MCASP_TX_CLKFAIL ( ^6 z+ x( |0 p7 `: b6 m
| MCASP_TX_SYNCERROR. i/ }- Y7 ~1 A+ g' S( W
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ; ~8 {$ ]% ~7 ?6 o; L0 ~+ {
| MCASP_RX_CLKFAIL
( X" H+ W- s7 J| MCASP_RX_SYNCERROR
/ |) X# W& z' \' }) O5 A| MCASP_RX_OVERRUN);
# b3 ?2 s( f) u4 P: L} static void I2SDataTxRxActivate(void)
3 E) G0 _% @( e3 v( V* J* o{ M9 G1 q9 L; H- A1 c
/* Start the clocks */
2 K i: | f1 t9 o4 @* [McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);9 A' N! \% a5 S, u$ }$ `
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */7 M0 a$ ^. K7 f; U* Y; n
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
& T! @# f+ o) ^/ K3 VEDMA3_TRIG_MODE_EVENT);3 ?6 ?- x' k' A; d. m6 W ]
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 5 g3 g7 u. z9 V) g& g9 X( K
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */) T$ B! u, {1 u" X0 f) Q) e
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS); s# e; L! s8 g0 o) z
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */$ w6 w9 ?1 l& l
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
! W" F) i! }1 S7 ^9 P6 G2 XMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);5 r7 G4 ]4 g7 C+ H! H
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);. E/ J; n/ c0 p( m1 o
}
8 ]$ T7 U, F# a+ r5 _1 s请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
6 Z; b0 C% k" }. `; E ^2 ~! a4 q |