|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
) w$ `6 U- `2 f) u7 Rinput mcasp_ahclkx,0 F- Z0 V5 Z: N! L- U0 y/ e' p% `1 K
input mcasp_aclkx,% v3 g1 x& M! q, ~, [
input axr0,4 U2 r. L2 o& I
6 r7 n: O4 z _9 r1 ?% G6 H! ]
output mcasp_afsr,
1 p7 X) v$ y4 B( g0 L: voutput mcasp_ahclkr,
; z" m4 P: n; i& q2 ^output mcasp_aclkr,
3 K. Q T6 T/ B3 Houtput axr1,8 Z3 g. r, f+ F: g# h. E9 u
assign mcasp_afsr = mcasp_afsx;& ^, l3 c( V K
assign mcasp_aclkr = mcasp_aclkx;/ l# f+ a6 a# X7 T$ c8 E
assign mcasp_ahclkr = mcasp_ahclkx;2 D0 i3 `# \( K
assign axr1 = axr0; / A0 D; o# }. u1 c, n3 W1 n% U! j
8 k: @1 w, S" T3 j0 _在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 * A; H5 w; `3 E& g* u/ T5 V a! I
static void McASPI2SConfigure(void)! {7 w" |- k' E, M
{
, T. O5 U8 i* j3 aMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
* @0 e+ |2 y' Z! M1 C0 SMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */$ g" g4 Q z) W2 r# N
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
- H4 J: W: i, UMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
# M/ j) c- J$ ^# Z" i! TMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( z8 T, q% u6 R
MCASP_RX_MODE_DMA);
{- `2 Z" B' W5 s7 q; HMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& c+ u% {9 u: X0 j0 E; K# [) K5 W: KMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */- t X* }" F& W7 p0 c( W
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
2 ^, d& N! _0 a; B8 K& T- tMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);$ w/ ^0 Y. m* X
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
( z% w. s. u1 S" H0 r$ k" wMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */3 |6 d; d; {) G
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);6 c4 g b" Q' O b" ~
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
8 T9 k2 B- q, [9 @) u- G7 kMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,3 m- }5 @' Q3 i' j$ L! j/ g
0x00, 0xFF); /* configure the clock for transmitter */) ?2 T# Z1 a0 Z ?( ]
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);' \* L/ N) ?% w
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); % e! S/ S" T, W
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,$ y( p ~% U" D" u/ z7 {1 R+ U
0x00, 0xFF);9 v# v5 _6 X4 V& a7 k5 [
& Z6 A2 S* m8 i; i/ n/* Enable synchronization of RX and TX sections */ 0 h. U: }# G! @3 Z4 i, D y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */* [: |! o% e; p. e: W
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);0 @. z# Q+ D# X& c
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*# [" i, j% G( ?/ `6 m, D
** Set the serializers, Currently only one serializer is set as9 p% b- x, N- ^2 o. H
** transmitter and one serializer as receiver.
. ~. q4 S9 C" H; @: Q# Z' ?*/
8 n) `6 ~( P% q7 W- _( g+ S7 cMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);( s s1 l: I2 B6 n8 S
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*1 p9 `. L7 f+ S& o0 T1 X6 R9 {
** Configure the McASP pins $ N! G0 a# A1 Z$ f; q$ j2 C3 k
** Input - Frame Sync, Clock and Serializer Rx) z7 F' ~# N+ X
** Output - Serializer Tx is connected to the input of the codec
- L0 Z/ y. w5 |4 j2 j' \*/
' c; ?3 A5 a- V; L5 n% `+ X7 mMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);: N* ^& w4 C: K4 J& p# A! Z' a8 |- ]
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
( T- N& S* f; EMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX2 P+ p) f$ L& r. H' V" z
| MCASP_PIN_ACLKX
) i4 N0 B- n* v6 A| MCASP_PIN_AHCLKX( n! h* J# S$ i' L
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */3 ~, |2 {" E9 C. ? |) K
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
0 } y E, \/ g| MCASP_TX_CLKFAIL 2 Z& E! E6 T7 R, A# K( u3 C: \
| MCASP_TX_SYNCERROR; E* K' G, O$ l% p( h. C0 e
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
! y8 [. t1 i0 s| MCASP_RX_CLKFAIL$ a! g# N' x% ]2 Q; p: @( l
| MCASP_RX_SYNCERROR
8 i& M3 Y/ O! ~. j6 y1 k6 O| MCASP_RX_OVERRUN);0 @, z4 N1 d3 P! n0 ]
} static void I2SDataTxRxActivate(void)/ a% Z4 f \ Y0 M1 _8 Y0 A% v5 M
{/ ^2 U; h' l* \, i
/* Start the clocks */
* | o' U% D! {' E* k' |2 oMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);8 P. r) G& B+ Y
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */' g2 v) d4 d& a) {6 d6 m; P, ?
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX, n& X6 e U$ [( |7 {/ S
EDMA3_TRIG_MODE_EVENT);
. f8 E) y* y" T: A! s3 H5 @+ A; ?EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, # \- p1 Q$ Y; H- H. w" n
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
2 S3 J! D& r# W6 iMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);9 K4 O" M2 v$ Y8 D+ I# h$ z" n) f4 ?
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */0 E( q1 i/ N& P$ _8 v
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
' l2 X5 @* m' c t/ b. SMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);. D Q0 E; G1 i% U: @
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);' o; a7 G; w6 ]' C. [ P
} % r- U1 g* r% C
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
1 H5 o, _2 ]' v" } |