|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,* @; m* Y' o% z4 ?6 b& L2 M
input mcasp_ahclkx,- W2 q: P( G. D0 r; t' T
input mcasp_aclkx,
, L- ~9 n8 z: O; ?$ U" oinput axr0,
2 @2 {6 a# N; i! Y% h% W" W
) I0 w& @& A0 C, }0 Joutput mcasp_afsr,. S/ B5 v- w! L3 h) M% |
output mcasp_ahclkr,+ G) ]$ v2 d' p; B
output mcasp_aclkr,9 m5 E) h2 |5 t* `
output axr1,
" i2 }) z6 @' t: @: p3 H assign mcasp_afsr = mcasp_afsx;
# C( M4 b9 ~9 n& f8 H5 N" _, Nassign mcasp_aclkr = mcasp_aclkx;# k1 y/ l/ e: n3 ?9 x
assign mcasp_ahclkr = mcasp_ahclkx;. j) [5 t+ _$ f' k, D
assign axr1 = axr0; 7 n% P: `5 l+ r
, `, {% w7 T" L9 B& s0 P
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
% k, @0 J+ r* H. b8 ~: V/ H: H+ i7 Kstatic void McASPI2SConfigure(void)
+ k: s% b4 r0 Z5 j8 a{; E; |2 k' o0 {2 [
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
; B6 x* ?6 B' _' s) E9 _9 Z. CMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */2 z! C, z1 `5 V" D0 b, J
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
j: W# @' M! o* K8 ~McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
, o3 F& f/ s3 v, F: P. p# ~- uMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
' |! \9 H) Z' z1 CMCASP_RX_MODE_DMA);
( }- L/ w2 ]; z# r) PMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE, p7 O9 t1 G' y
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
5 o+ @. \+ _; \ fMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
& w) |" v" p" e# ]! l- r- HMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
b+ e5 X# h" b4 ]McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, / Q6 F) Z. i+ A# x2 Y& R+ z
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */9 ~. y s4 k# Y
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);. e+ m% ?* V. D9 l' d+ U! c; R1 a
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
$ C& `$ r- S |1 \, L) u8 E9 OMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,: L! [2 o2 O2 p0 y0 k. L) ~# b
0x00, 0xFF); /* configure the clock for transmitter */
8 D+ F# h! W5 `; Q7 AMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
# R* }- F4 G9 FMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ; t* H+ J& S) G- ]
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
; N5 X# J0 I% z/ l+ b7 E4 h d; m0x00, 0xFF);3 X$ F; A3 h4 f7 f. d4 F
: C* P7 D# i) ]) d A1 t- Z/* Enable synchronization of RX and TX sections */
; @5 N: ^) x9 P: e. g* hMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */+ O3 B5 N8 {( |# E; T9 X4 e# y
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);5 e* I# F0 j; H
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
0 @% ]7 y4 N) ^) m \' z1 V** Set the serializers, Currently only one serializer is set as
) ^; o; G( `$ N9 `5 H) R** transmitter and one serializer as receiver.- O4 x! y$ V$ V, n
*/# Z4 h+ t: W; p# S5 v
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);. x: F" P) J" _9 G7 L: t; A- h
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
4 Z/ ~. }" R T" v+ H7 G2 j3 y** Configure the McASP pins 5 |2 @( f# {0 h; b9 z3 u; N0 w% \
** Input - Frame Sync, Clock and Serializer Rx
\& J, B8 F& F** Output - Serializer Tx is connected to the input of the codec ' O; A1 o% `, ?6 }
*/
! P) w. x! C4 Y. D$ [; {( x+ }McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);3 C% z: z9 H& h+ @
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
2 Z& e( F) `6 H/ ]6 y( F3 MMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX( w, o$ N# J5 q4 T0 j( t
| MCASP_PIN_ACLKX
8 i2 D8 j0 G: U0 p* j| MCASP_PIN_AHCLKX, u5 ]7 O, z# z0 k& G/ A
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */& G4 b1 m. B( T
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
0 }! s. [- X* x, f$ Y| MCASP_TX_CLKFAIL . b$ b4 n& Z9 D1 N" v
| MCASP_TX_SYNCERROR* l8 w) ^1 g9 T) i I6 M8 o! W3 C
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR : n: W2 Q `, n
| MCASP_RX_CLKFAIL: t8 Y0 u/ U7 O1 X/ Q* k6 h
| MCASP_RX_SYNCERROR
5 A3 u+ a/ V t/ G* G4 q8 `( f7 q| MCASP_RX_OVERRUN);
; h. w% H4 O7 u2 V1 _! c' |} static void I2SDataTxRxActivate(void)
$ j1 c! {2 B( G x$ x. [. n{
6 L" A- ^3 b. n$ Q- N+ ^) [- q/* Start the clocks */9 T O% H' @' J; D$ }
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
1 i( w1 d% k. k( @. H AMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
U# z) q2 x# z+ L8 Y. LEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,! E1 {6 r4 R! P$ v5 E4 |4 h
EDMA3_TRIG_MODE_EVENT);
8 G+ R- C1 t- \/ N! ^EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
% {9 E% f5 u2 D8 \EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */; ?9 L; V9 D, m3 @4 x/ J( @' |
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);7 i' Z1 q) b7 f, }
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */0 x+ b/ h* a- Q4 g
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
( G% D, y& j" {4 p; t+ {0 uMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
1 F7 e( c* m7 Y' O A5 ~7 pMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
/ @% a, G" Q4 @$ n) o}
9 L# f. ?3 R5 o请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. / }! o4 q( U9 K9 B* _0 A
|