|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
5 I- \* Q3 U6 K& d. K+ Vinput mcasp_ahclkx,
5 S: s* [# l4 t; J# t8 \, v5 O5 ninput mcasp_aclkx,
6 j+ I& d! c: U' {/ Finput axr0,
2 P0 o1 f6 |4 F n7 u. x# E
8 C' Q2 x a+ M6 r/ ioutput mcasp_afsr,( o, r$ A3 j: J4 S9 X9 U
output mcasp_ahclkr,; r7 U9 b0 u, D; `! ^) @
output mcasp_aclkr,
+ z) m) H# Q7 m, d. R: \% q9 f) Routput axr1,( V& s2 \" L& ~7 n1 {3 y
assign mcasp_afsr = mcasp_afsx;8 c8 s1 |' l! w/ m: u( D
assign mcasp_aclkr = mcasp_aclkx;
L' j" u$ B+ }6 A$ xassign mcasp_ahclkr = mcasp_ahclkx; R# ]. `5 r$ {
assign axr1 = axr0; 0 n/ F9 f% s4 d( ]% `
9 a6 h. F+ C8 A在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
) f1 L% s3 `. A, O0 Xstatic void McASPI2SConfigure(void)
/ I- y+ f! A$ U) O' ~* k7 q{
( Z: W0 t$ s% D" K- E: I" bMcASPRxReset(SOC_MCASP_0_CTRL_REGS);; F1 a4 p2 p- M9 p' Y
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */! S0 P) k. T8 I5 e: f
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
* }! | D8 X, F. L6 _1 @McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
' a g: v$ m8 t1 `" yMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 T* Z: D3 R8 E! D) G
MCASP_RX_MODE_DMA);. Z0 ?% I* |: Z6 A
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 }/ P: [( r- U0 O& r! T% `
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */# A" c: t: @! c# y$ R* i
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
2 i5 z6 B3 i5 w# w$ p. c/ MMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);: V8 R" k3 R8 f# m
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, . @% t7 @4 K! y, f4 d U3 U, h* Y! b
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */# i4 e6 {7 l( d* m
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);7 D' r; C- U L7 g$ _1 `
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ( G/ S6 ?) o8 Y* o) @1 N& Y6 ~
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
* _, `/ q4 \/ J0x00, 0xFF); /* configure the clock for transmitter */9 P8 X2 m% d9 m$ }+ x
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);# U6 |) @/ V! q2 W0 k
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
, f7 I4 m( G! W; uMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
# ]$ ~. \2 D6 k1 a9 I0x00, 0xFF);7 j4 F9 j; Z4 n
+ e8 p4 P& b( C" W. I
/* Enable synchronization of RX and TX sections */
- i$ e! m1 z) l$ vMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
( C# s+ Y5 B0 O& f4 l3 nMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);8 D0 R# Z1 |4 c/ J! i
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*1 h t C! o- Q6 {- c9 |
** Set the serializers, Currently only one serializer is set as* g5 t/ E o: x& l4 s
** transmitter and one serializer as receiver.8 q/ V" t8 @$ j; ?% Z
*/
3 m5 C. ~" J* H" ^% Y( tMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);; K4 S( ]0 J* Z6 h4 e4 ^5 G u' V
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
; W% [9 @+ d* v6 p9 }0 @# g+ C- C |, l** Configure the McASP pins
4 u0 c- b m& q9 \" V( `** Input - Frame Sync, Clock and Serializer Rx+ s* y( ]6 n6 O$ S+ i
** Output - Serializer Tx is connected to the input of the codec & P J8 C' D5 u3 m
*// s, \9 }4 q8 B* b+ f
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);1 `, K5 c1 E4 _
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));) v# y( `8 a8 {2 r% `
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX% F- d8 `! H7 |( S9 [8 r( d
| MCASP_PIN_ACLKX$ B* S: ~2 O7 k. r) c% G" ~
| MCASP_PIN_AHCLKX
. q+ ~8 _7 W( @& o| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
( k: L* y* _* Z, kMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 4 I- G9 ^1 K5 X7 C: d% {& I
| MCASP_TX_CLKFAIL
?/ ]$ Z; A. X5 d6 U: o| MCASP_TX_SYNCERROR
* P. e- i6 Y' o; n- Y| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 5 i( \/ C8 Y" u
| MCASP_RX_CLKFAIL" z. w! E& O: o3 X8 o7 K7 a
| MCASP_RX_SYNCERROR 9 S! M) J2 D- p" t. x# ~4 ~
| MCASP_RX_OVERRUN);
% W# e; s' r% Z, E& r& t6 ~} static void I2SDataTxRxActivate(void)% p4 U* e; C0 m5 M
{
5 N& C$ v2 _6 @9 H/* Start the clocks */
- T. `" a# k4 [7 X. O! q& v, P4 QMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);7 N# {% C7 {- v/ y& [
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
}6 @) j3 E/ M0 XEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
: }" {& G1 S4 D0 P/ P. AEDMA3_TRIG_MODE_EVENT);
& F: k% l: A" hEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ; \& H9 P& ], r9 ^
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
2 J% l: k2 i, x) ?9 M$ L* ]$ zMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);$ W, o" K3 ^+ C& @: J5 t: z1 D# [
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */& O9 P G: `) }# W- |
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */2 U9 G* ~' g5 x
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);9 u% }4 ? H f- s) S" T2 n
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);/ Q3 W9 b: U5 C, x; j2 b
}
3 P5 d$ X/ q/ i; w$ i. q" X请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. S4 ^. a1 _% l- a" j+ B! f
|