|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
( t$ V- X6 f7 linput mcasp_ahclkx,
$ h% d8 _! s+ C* j" r$ Kinput mcasp_aclkx,( C( y) }+ f$ V9 h- b9 t8 Z
input axr0,! E7 E: h+ H. m
! P. |7 P) ^. B7 k' o- soutput mcasp_afsr,! c% H2 {+ A% n+ X4 @
output mcasp_ahclkr,6 A: B3 p" m$ V' E1 Q
output mcasp_aclkr,
4 U, k+ K& ]% [( L! \4 k. Xoutput axr1,2 I8 m+ A2 Q& d6 F+ c* _1 c% b
assign mcasp_afsr = mcasp_afsx;% i7 t1 \4 s+ m5 m( ]
assign mcasp_aclkr = mcasp_aclkx;
0 W* w' R2 L3 j" ~& {. E/ ]assign mcasp_ahclkr = mcasp_ahclkx;- w# { \2 J1 r
assign axr1 = axr0; * F. y3 P2 g @, ~" W
' P" m- q2 u# n2 Q% @在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
: Z' h% y' [7 W: istatic void McASPI2SConfigure(void)
1 t3 c: N$ X$ O2 v; @- T{$ |" x6 o7 G* V( h" D
McASPRxReset(SOC_MCASP_0_CTRL_REGS);& A3 F0 n7 w! J! T2 a5 L
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */' J( \$ j) b' U3 m
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
! N3 v# y p5 E8 `' PMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
, m9 u8 ~3 Y$ b; Y9 E; G% lMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 m6 ]1 ]+ r9 P; v$ Z3 cMCASP_RX_MODE_DMA);
: J: v* `4 c! QMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 O# F2 s# _0 v) F4 J( Z9 G
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
* j, r& e% p. ]: OMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, : E. c3 _; b& i- z! k
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);4 p/ K0 i& _/ P2 ]( y+ a" {
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
4 G6 o- w7 N$ M5 b: fMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
/ _% D" [; N' D, rMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);9 Z, i5 {0 V7 T) R3 D- w
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 4 \, s' r9 X& j; b
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
& X. _. A" H% g* x2 O) ?0 d/ s+ g0x00, 0xFF); /* configure the clock for transmitter */
, J- L1 {7 m# R- ~& S) U7 VMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
; T# k) v, N3 ^McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
9 |: X7 `% ]: [3 LMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
6 i9 o6 [9 C6 [, G" ?3 R' J0x00, 0xFF);
& T( M3 v3 e( `# C' o8 ?2 c0 X$ a8 g K; C
/* Enable synchronization of RX and TX sections */ . m6 H! U+ K6 B l! I% @$ ^
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
) e" c9 ~) P/ O; _) ]& w4 M& @McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);8 i( O" ~4 ]9 ?9 Q! x# ]
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
" Y. O, c2 i; `# z( v! M$ w** Set the serializers, Currently only one serializer is set as) B% _3 A0 f1 }/ M, ~7 R7 k
** transmitter and one serializer as receiver.
! L- ?4 p% W, ~5 {8 ~0 d$ }*/
) s5 O$ p4 n/ n5 x7 H8 kMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);8 A( `$ `( ?; v( x# @8 ?& S! M: G- Z0 |
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
8 u$ f* X) t1 n1 g** Configure the McASP pins
9 }3 C( V/ V3 j** Input - Frame Sync, Clock and Serializer Rx
( @! F! {1 v6 J& D6 f* Z** Output - Serializer Tx is connected to the input of the codec
! l3 }- M0 f; a' O% c: P$ a*/6 M+ Q# r0 y4 G/ D
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
7 L. A6 }" {! r' F* f! hMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
0 }7 J2 C* l- {( k3 GMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX- T5 m5 v6 s9 {0 V) j* w7 ~
| MCASP_PIN_ACLKX6 _" } e2 c: `6 ]( ^; T! y! w
| MCASP_PIN_AHCLKX0 m* g5 {2 q2 |% W5 ^
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */3 w" }9 K5 P- n; Z
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
# r7 A5 t" c4 G5 i* W1 A1 |, k| MCASP_TX_CLKFAIL
/ w3 d2 \. {0 k4 A! ] Q| MCASP_TX_SYNCERROR3 e) h( I, }; ~6 x: k2 s5 v% w
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ' U7 u' t6 V% U6 G0 ]( c
| MCASP_RX_CLKFAIL
# Z/ @7 E, ^. \4 R| MCASP_RX_SYNCERROR
3 ]( Y) `8 u4 N/ m* n2 Z* }| MCASP_RX_OVERRUN);
6 Y* K. V) ]& t. v} static void I2SDataTxRxActivate(void)
) H+ c+ ~ F( t# f7 t- \{# e3 R3 ]6 M7 u- p
/* Start the clocks */4 A2 h, h: W- H/ x/ j* a
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
- ]/ I( x4 G) c7 }9 zMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */0 C+ E" m8 J: u; s
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
5 `2 l9 L, L' b. I' ]4 bEDMA3_TRIG_MODE_EVENT);
, W& y7 G6 |! pEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, # n' W7 Y5 y C9 B! O
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
- L- M/ K( s6 z" pMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
# u9 X$ N/ t( J; [7 pMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */+ Z5 |9 U! k# ~( p
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */; J. y& f& l3 [, W- g% h
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);. `9 i+ C0 D/ I! {' [# X5 F0 ]
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);' _8 w% ^9 a8 Q5 A" C
}
0 K0 u& w1 V& X' L/ j请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. $ P7 f' }: Y6 X( T8 @2 m& Y8 |
|