|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,, a. l4 ?7 U$ C" A1 D. U
input mcasp_ahclkx,/ R6 W) a, s* `
input mcasp_aclkx,5 t% v+ M6 G- l% P2 H# W
input axr0,
; G, J1 n7 K9 ?$ w2 r: X1 H$ t i9 _. |! z- R) t7 T
output mcasp_afsr,* {1 E' ~) R% N
output mcasp_ahclkr,
- `4 P" `5 w p& toutput mcasp_aclkr,
4 T& h! L! \ y3 i# Aoutput axr1,/ \$ T- X6 H2 T# v% |% y
assign mcasp_afsr = mcasp_afsx;
( W4 i" K3 {+ ~ |) V* q4 [$ ]8 Rassign mcasp_aclkr = mcasp_aclkx;% Z- k2 B: M. }! M) d
assign mcasp_ahclkr = mcasp_ahclkx;+ |7 s0 F, n- w' b1 l
assign axr1 = axr0; % t% U' j7 g4 E$ X! M
8 o4 |+ r: z- j* q b' ?
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
) T$ W& U, W& ]- Ustatic void McASPI2SConfigure(void)
- Q- U; A& U0 X/ h4 E; n9 T, E5 S{ d, d: a2 {9 l; y' i' j
McASPRxReset(SOC_MCASP_0_CTRL_REGS);+ H9 {: ^: Z1 R
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
" w7 O: J9 N- |! pMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);7 m! o# R/ k' d
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */5 O( p) c( f1 S3 X
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# B6 P6 ^4 U* a4 U- {MCASP_RX_MODE_DMA);
; L# V) W+ n. ^; g+ G# SMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- h$ L0 |9 a+ w6 R6 A. BMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots *// k# H! L/ f# k3 a- }
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
. R! h* _ z4 H4 _+ SMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);1 D \! s3 O* f" t: u( a
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
* M X1 R' b! iMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
: Y: L% k/ w- z5 h3 f& ^4 B/ DMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
. B; O5 P# _ d3 tMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
( Y! @3 _9 ?3 D' k- ^" N5 sMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,: b& F4 S7 F2 C( K& S- E
0x00, 0xFF); /* configure the clock for transmitter */
% t5 p6 [6 H1 {4 @McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);8 F4 X- c7 I ~0 G# P
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 9 O3 l9 d2 h0 I
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,0 J! m7 y) b- ?0 I+ b/ }- L# A& `
0x00, 0xFF);
" k8 v" T2 ^0 |
% r$ T/ O* {4 R0 j/ b, ]$ z3 t9 o/* Enable synchronization of RX and TX sections */ 3 \. e) \+ }& u
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
3 x4 a/ i3 w$ j' \& J& B eMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);9 w! k3 Q$ s% V% \6 w4 J
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*1 p; B! M! r3 H! Z
** Set the serializers, Currently only one serializer is set as9 m2 V0 o) F, W
** transmitter and one serializer as receiver.( F6 c$ y2 J8 ]. D5 |8 n
*/
# \, o- @* L6 s |" y4 u+ kMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
$ O+ i: Z# v5 o/ K& O: B# WMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*: d! g% k/ o0 j }- E% v; F
** Configure the McASP pins ) @2 ^0 j' a- K, q. G! |3 b
** Input - Frame Sync, Clock and Serializer Rx
- |/ G2 J$ I: G8 X- r/ U/ @** Output - Serializer Tx is connected to the input of the codec 4 f7 i% ~# y1 p- u2 `- I: F- p& X
*/
; V$ m; _& k! \( l4 K9 P! ZMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
5 p) V% P" H* k8 YMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
, m4 q0 I) [# U2 k0 X: w5 CMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX* r! L; Z/ f+ f; c; ^
| MCASP_PIN_ACLKX% q; N! U2 F/ z9 P: ~( Z
| MCASP_PIN_AHCLKX
1 K. \) i( V1 H. x| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */) H9 D7 @+ y8 }) X. N
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR _& R. c1 G- \. Q. ]" U& A7 U9 k
| MCASP_TX_CLKFAIL
1 g( \) k2 ?8 @. B6 Q# e5 k s| MCASP_TX_SYNCERROR
% s' j' e2 D: U- Z; b: A4 J| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR " J# {2 I8 x% t' D, O' h# ^
| MCASP_RX_CLKFAIL
: K; r5 p6 P1 r) l1 _| MCASP_RX_SYNCERROR - W! q3 S) @7 J* f$ \
| MCASP_RX_OVERRUN);
4 U1 W9 e3 e$ {} static void I2SDataTxRxActivate(void)
: o9 t. }" P8 L' ~{
* N7 I5 I3 U+ y$ F* s/* Start the clocks */
. O. V! T$ A; K$ Y, `McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);) Q/ j% `1 \8 y1 v2 s( _# H
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
" t9 j- Y! F- y3 Q$ hEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
' Q3 C+ U/ E( {, }: x, JEDMA3_TRIG_MODE_EVENT);% P9 Z! y. u2 G" f; {
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
h5 T. o8 F1 j6 ^9 r; u; |EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */$ |" [% E* d; [
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);& H) Y9 u+ G! O- i# s
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
% a# r: M3 N& F; j& b6 bwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */, Q+ n+ s: Y+ q0 y, G8 t6 o' U
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);! ^% {6 a( i8 _) v/ h1 ^( P" J/ k. C* X
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
# a7 M7 x2 D1 f} & N" p) x; k! P" ~( r5 M4 V
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ! l6 j% o0 I% G2 W; Z
|