|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
9 x, O; l+ I- yinput mcasp_ahclkx,
0 F3 h* F2 A8 i0 w$ Pinput mcasp_aclkx,
% K0 X) ]1 ?' Zinput axr0,4 Q" ~* O9 P. \7 t5 r* b
& c3 j) W8 R; j+ Y" b) k3 G: g9 d
output mcasp_afsr,8 T* v! z7 o/ M
output mcasp_ahclkr,# P9 z& O% O; Y! R$ q- g7 _! y
output mcasp_aclkr,7 `! I' N$ C: \$ F+ o+ @5 j
output axr1,/ g' [0 K- @6 }2 t6 x/ s, o! M: A- o* Y. h
assign mcasp_afsr = mcasp_afsx;0 Z* s9 P1 Q9 V: V" G k \
assign mcasp_aclkr = mcasp_aclkx;' d! L* x) g2 a1 L
assign mcasp_ahclkr = mcasp_ahclkx;% o a4 r6 N3 U
assign axr1 = axr0; : G: F% M1 }+ S2 j
: U8 ?# a1 Q! l2 r
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 9 I9 m$ m6 H, m: m2 t: [
static void McASPI2SConfigure(void)
0 ^/ ~! a; i0 e% a) {{
. U' O+ C6 x w7 [2 v' ^* PMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
4 l% k4 Y6 ]) @( ^4 }' N" |1 PMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */! ]3 \. [8 U( Z* R$ _
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
2 Y0 |2 C. U. e3 d) \McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
7 P8 O: u/ m5 Z9 d, TMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 e: [6 M/ w, \MCASP_RX_MODE_DMA);
7 ?; m, j3 g1 D4 V9 {: G( w w8 {McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,5 [- A7 m, z* y- ~! ]3 r
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
- V1 J$ v3 y- P: i6 DMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
7 u" p G- x% `- A+ { n$ sMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);) J# ^9 f- Z4 l
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
+ }& I% ^3 }' E$ z2 lMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */; I5 {6 W* [* J) A1 G
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
& ^ u, w# x8 ?! {3 |" S: m BMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); % u! k* C2 P; B/ ^8 I. s
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,+ e; |( S! x6 t' M
0x00, 0xFF); /* configure the clock for transmitter */7 @( @8 q7 i/ f
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
/ y7 j7 K0 B* Y9 _; q& P* _$ F dMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
& N5 k$ |9 g$ x* e' OMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
. _4 r/ t4 F# ^* B/ z8 P0x00, 0xFF);
4 i) \+ b& u; k7 p/ g9 {7 y+ _ C& W/ t0 h/ t; g: Y
/* Enable synchronization of RX and TX sections */
, E" o$ E4 ]/ OMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */) A1 G1 l: x: k- x: S
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);0 q7 w; o1 s" \5 H8 J
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
" W/ A+ _" n/ W5 [** Set the serializers, Currently only one serializer is set as2 B ?8 ]2 J# G: L4 d8 Y* ^$ @
** transmitter and one serializer as receiver.
- O4 E$ g3 F d0 Y*/* M' l6 ]* s3 T/ v' F
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
: T" d0 X4 [- Q2 bMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
2 J& i% }- J" O** Configure the McASP pins
4 r/ q$ P1 [. M7 v** Input - Frame Sync, Clock and Serializer Rx) K \. d- w& i
** Output - Serializer Tx is connected to the input of the codec 4 Q% H2 C' S7 I% _5 @& w- y3 R
*/4 i+ F8 C0 u! z4 j/ F" O
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);$ C4 |! v6 @# K4 i# X. b2 \
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));/ q: J q0 G+ x' v* o- k7 Y
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX8 {* Q$ V# V7 @' L7 \
| MCASP_PIN_ACLKX# K) K8 q$ H* o: T6 h3 D
| MCASP_PIN_AHCLKX _2 g- K W) l
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
+ b& H7 C. T. C" _3 _McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
9 n; O" M9 W+ g, Z| MCASP_TX_CLKFAIL
7 W" Z+ L' r: v& X: K: o y0 C| MCASP_TX_SYNCERROR
9 S) j# W% ^( j. J2 E$ J! s6 `| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR " ` _: a+ s/ h8 Y6 r
| MCASP_RX_CLKFAIL, K* w5 g# s# e" K) k2 s( [
| MCASP_RX_SYNCERROR ) ~& s o8 l/ _8 _1 H3 H
| MCASP_RX_OVERRUN);
$ r4 \* [6 ?$ E; q$ }# b* ^) ^# Y} static void I2SDataTxRxActivate(void)
# [1 d# L, T' Y S C+ ^1 S{% x( V w! q5 k4 M/ c! q
/* Start the clocks */( c5 S/ ~* h# i* q7 h5 k
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
: x" E2 K+ A6 M. x' G, hMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */9 ^- D. V/ j7 w$ M; D
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,! o0 V2 G1 S' y& C6 i
EDMA3_TRIG_MODE_EVENT);
) V" d/ C3 a5 V. `4 ^/ tEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
3 W# {/ P2 T" q' eEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
! h& @2 b9 F4 c) ~! g# NMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
3 y; L# m: Y. e* |* s ]6 g& gMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
6 v9 v. ^5 U5 \' c# m0 W4 B% I8 nwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
. j" ^$ D7 R2 Y4 `McASPRxEnable(SOC_MCASP_0_CTRL_REGS);- f, k- t5 G6 X% O
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
( @" Z2 j" k, M3 ?} " F$ e; U- a1 g" ?1 ~ A& J; Y
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. & I" {- o8 s1 i* c) P$ @: p# m6 g
|