|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
8 Z) ]7 {9 O( Z& g- iinput mcasp_ahclkx,
8 i K- F! e3 ~input mcasp_aclkx,
8 M8 h- W/ H" Z. {input axr0,
$ t. \4 v) L. x- w9 R) e# @. M& q0 {& u3 ^1 p
output mcasp_afsr,
$ N; F9 K2 o6 f- t! J1 Zoutput mcasp_ahclkr,
2 s, b* k% F7 C# Y- v5 Moutput mcasp_aclkr,0 \9 m& e" `) L7 a' D- i! Q
output axr1, k8 B& ?, `" m" Q& Y2 p0 K6 g
assign mcasp_afsr = mcasp_afsx;2 v- T( a9 h6 r7 R6 k% H% F3 ]1 k/ V6 Q
assign mcasp_aclkr = mcasp_aclkx;3 |/ y5 h% E# d* N& x
assign mcasp_ahclkr = mcasp_ahclkx;
& x. ?" _. {) T+ @assign axr1 = axr0; 7 F+ K' d8 j5 U( r
W: [6 v1 v% E1 n: f$ O) v% E
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ; {3 O- z4 J; \$ a: ^7 w$ a
static void McASPI2SConfigure(void)9 x. Q5 w- F$ p6 O- m' J
{( @. t* y: k0 D1 G
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
$ j) n) b5 d) i: k9 c% CMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */$ r! s2 x' ]& x
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
. s3 K. o+ s+ q% v& w3 ?McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
& @- e! s% Z$ f7 IMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. D* Z2 S1 P: d+ }. }" kMCASP_RX_MODE_DMA);4 H* H- b- R0 g u& I
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE," r: A( ] n' c% x# b
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
1 a) W1 B4 D% R* IMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
- A0 j: _; J( A0 y" \, j6 v x: RMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);5 f7 h W& h6 `; f, B1 D0 |8 I$ o
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, # h' M, M u. s6 t0 w
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
, T' R, f( Z# J* ?& l$ E/ {6 IMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);* O ]& [. f( @' h* b( P
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
+ }0 y B5 q: f* }McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32," r5 Z( ?* I% }' e( p L
0x00, 0xFF); /* configure the clock for transmitter */
, g& n, C; t% IMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);* `7 w6 U1 Y L
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 0 O. O# U; t3 b0 P4 ~
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
) s$ i! |4 Y& V* v- [6 W8 @; g/ }0x00, 0xFF);
; `. l4 \8 l6 y. N9 h4 \
* I( T s( U# U( Z1 w4 U1 K Z/* Enable synchronization of RX and TX sections */
# k- j9 [) p' ~8 l' ?( VMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
: ^& m" c+ c. m3 D* ~" Q# fMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
0 a. }) e. d) w0 T$ `0 p" \McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*. P% z, [+ I0 v# F3 P7 C) A
** Set the serializers, Currently only one serializer is set as% J; M% I! g. h2 G
** transmitter and one serializer as receiver./ Z( r! O9 P8 U4 {, T( `
*/# M+ {- V5 d x4 R) {( V! I* [
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);, y" c, E* S0 h h
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*( C. B" P5 D- o9 U+ X4 W
** Configure the McASP pins / k* \# N; a& ?7 [5 `4 u; x$ h
** Input - Frame Sync, Clock and Serializer Rx0 s- I& q! P: ^5 g+ g: ]1 E
** Output - Serializer Tx is connected to the input of the codec * t9 W: W1 @1 `+ G! h* @0 t
*/
: J Q0 h" j- E$ ^& PMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);: q; k4 A- j2 W
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));) n% Q! j5 t" H9 j$ R; Z! s
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX9 }2 R% y b& A; y9 M: g1 x( x$ }
| MCASP_PIN_ACLKX% |; u. Q; B' Y+ Q
| MCASP_PIN_AHCLKX6 Z8 q, o( ?) C* o& X
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
8 ~/ u% W0 O0 Y. `McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
4 D) G# E+ f! q+ o* }3 S7 f* U0 `| MCASP_TX_CLKFAIL
4 ]9 g% u( k( m# s2 A) || MCASP_TX_SYNCERROR
* R4 ]; s$ L0 o( p' `: @| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR . t/ ]/ o7 g* T' o
| MCASP_RX_CLKFAIL
" T! g" U3 B! w/ b7 q8 a; ~/ _& q| MCASP_RX_SYNCERROR
- Y% r* t4 } ^& f4 j| MCASP_RX_OVERRUN);) I9 L3 F- s+ w8 P
} static void I2SDataTxRxActivate(void)7 C9 E) \$ a" |" u) \# ?) H
{2 J9 K v, s' E! v- P% |/ G
/* Start the clocks */
$ ^7 q3 W5 | ]3 v$ U# g9 r3 OMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
3 w* X! m& }/ z$ D3 z( x& F. _McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
; A. z( J4 E0 I3 p% CEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,: P/ [' v2 k, z7 F) X" [
EDMA3_TRIG_MODE_EVENT);0 B! }. w6 A0 P' t
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ) `' s$ g8 p) H& z. o
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */- y$ d+ }: w5 \1 H4 ?" I
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);1 D6 F! r* N( j: ]$ T
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
( |' e" d" g. Wwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
% E, h! g* |+ P2 A' @2 OMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);" F; W) V. I) @
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);5 q' w$ F, D: r4 r
}
$ k4 M) e8 \. U9 T _" L- Y' j请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
' M. W) j( k/ N Z |