|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
9 h, U5 e; U# u. `5 f. ninput mcasp_ahclkx,
2 n' A3 n* z1 h5 U% Pinput mcasp_aclkx,% B3 W# {9 O- `' Y! u; G& C: o
input axr0,; P8 c9 d4 V" E8 s0 w
$ k* W* K/ p. F9 y4 X% U1 R
output mcasp_afsr,( ?$ l3 }/ y6 \3 V- D2 e
output mcasp_ahclkr,% N* o ^/ x1 j* O' _, j. @
output mcasp_aclkr,+ O+ k, ?& k& j" P. k+ R3 ?0 W
output axr1,
0 v# c# X7 k$ h8 p% z( g assign mcasp_afsr = mcasp_afsx;
, a- T7 L3 j1 ], y/ q# C( a" \assign mcasp_aclkr = mcasp_aclkx;( u4 m& ~4 A: {# q
assign mcasp_ahclkr = mcasp_ahclkx;9 N: `/ N2 ?& t& b( \8 Z- o
assign axr1 = axr0; 6 N8 q7 F' t, | g/ P, [; V( W4 T$ o7 R
5 s, o7 j" A l$ v0 Q: t在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 % j# s/ p: [2 d1 t; r: n8 q( I8 K
static void McASPI2SConfigure(void). v0 N( v( I6 c1 [) w+ @( C
{/ L R: M' S" o8 x% C
McASPRxReset(SOC_MCASP_0_CTRL_REGS);2 H7 L( z2 l2 v) N! A* p
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */$ K& _0 \/ b$ H5 ?
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);) X1 H0 i+ O" d+ @3 i
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
; s5 l' @7 C' Q5 Y& i& t- B- _McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 F0 C8 f1 z U, Q# M, f
MCASP_RX_MODE_DMA);, x9 N, u" `5 \" P+ x2 s
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* L& m8 c: X0 W3 h k" \
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */* w8 C) g6 t. h; |: P) y
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 1 [3 y& G9 U. V" v; Y9 }
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);( b8 e C$ F8 a b
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
1 p6 ^2 I* S, ~* {7 x: M* m0 vMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */* s2 S- o' d* l
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);9 e/ n! r: j' m+ v: N$ u
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); : ]; u7 _4 u. W/ M' `1 Y# s7 i6 p) ^
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
$ T7 n6 m# b% X m O/ X0x00, 0xFF); /* configure the clock for transmitter */; U2 K( o) N3 E" X3 ~* X2 G+ B# @ W! W
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
# P- g' C& r3 T- u- P; {McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ], |1 Z" k B" n" D! s+ z( }" [
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
4 G- M3 L. d. m9 @% B0x00, 0xFF);
+ X( b. ]. m& O6 X8 \, U
; Z0 b7 h' ~8 M& t. P; D# P/* Enable synchronization of RX and TX sections */ ' {) \; U* d+ [& L
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
; x: S6 K0 ]% b2 ~ I- lMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
7 Y% Y: n( [1 z5 nMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*3 b+ Y, @- R- v& ~3 e7 a y
** Set the serializers, Currently only one serializer is set as8 O/ N& @( G# f( V; s
** transmitter and one serializer as receiver." E8 _8 y9 F; z. W. h; @
*/
6 A# R8 `+ e5 ?0 l* q5 ` pMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
, [! W' J* u/ v7 W, bMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*! T9 ~' M1 A* `1 ~5 `4 [
** Configure the McASP pins $ M0 P: t* d$ }- q4 q8 _) {
** Input - Frame Sync, Clock and Serializer Rx7 N+ T, t- q( q0 l
** Output - Serializer Tx is connected to the input of the codec 9 B2 i% c3 m$ ?8 f5 g
*/4 k2 C$ u' W; v1 z6 o
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
) ]% Y8 R" `9 J# F7 v' r, ^0 h) lMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
8 u+ j5 f/ ]7 w8 A g3 dMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
4 _' Q5 j4 G" ?: \/ k! @| MCASP_PIN_ACLKX" B% |$ ?& M0 ?3 ^1 B# F) S' C
| MCASP_PIN_AHCLKX8 q4 O; x* R; |* H8 t4 n
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */2 \# f+ `) i4 u2 `9 [
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
$ I0 f8 P! N7 o; C8 J- M| MCASP_TX_CLKFAIL
9 C8 v- L# \5 v ^7 s- j* `| MCASP_TX_SYNCERROR
) h: T- d! T( H& }3 `6 r: g* I| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
7 k. t, C) \) c9 Z8 d$ |* T* s| MCASP_RX_CLKFAIL
. l* {0 W1 n! f| MCASP_RX_SYNCERROR
1 M4 G+ E5 G* M' N+ w$ X( z4 I| MCASP_RX_OVERRUN);: }7 @3 h" \6 F
} static void I2SDataTxRxActivate(void)
( j5 R3 L; K! x! n{
7 ~6 w- Y. p% z& j2 v+ ]/* Start the clocks */
/ N: v$ _' q+ m& f2 M& `+ }McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);! P+ O$ a5 }2 G, N; o
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */0 V2 c/ {9 ~ t; C8 s" J
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
^: @. o4 v% U. }8 `3 ?0 T. s( xEDMA3_TRIG_MODE_EVENT);$ z; h% \, q6 n1 j
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ; X' A% A- x) M& @2 x
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */0 _& F8 o- d7 m% Y, R6 y& J9 B
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);% [) p* X1 w/ D4 [0 m
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */' ^; V" d, J0 _ \0 ?4 C
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */- n y2 E$ \, B. C" A1 p) B$ L
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);. J! y1 |0 v: u9 ?# M
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
* [5 r/ u; T6 w% S% ^; b P}
$ Z1 h+ F. e: J! B2 s请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
9 E" @8 L) m& j: ^ L- F3 R |