|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
+ W o m# U1 Y( u! |# pinput mcasp_ahclkx,
3 Y5 K- a6 w0 Z* \input mcasp_aclkx,! G# c$ F8 v, b; R) }* s+ _
input axr0,
6 X/ q- v! `; Y1 W5 v3 u: ~8 d" U s
output mcasp_afsr,- s G6 ^' t1 E* G0 e/ Q" C% |9 u
output mcasp_ahclkr,7 R5 x5 P0 y# N
output mcasp_aclkr,
2 A9 z; P9 o0 p/ }output axr1,
9 q; h1 S1 C" K- |/ Y assign mcasp_afsr = mcasp_afsx;
) A, d6 V9 h5 z+ \! P' E# [assign mcasp_aclkr = mcasp_aclkx;0 e* H9 E& [8 q0 g5 i! `4 U* s
assign mcasp_ahclkr = mcasp_ahclkx;1 S8 p# ~( {8 L8 j0 {
assign axr1 = axr0;
5 l1 g8 z) f. y$ l
, u* w' h Y* l4 R) V) T. W' U在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 % S+ e d3 ^; M
static void McASPI2SConfigure(void)( c1 M9 ?1 {% q4 V0 I: T
{
5 {2 x* z3 v, WMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
& \: O& B, v3 w. BMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */& J+ T g8 c D& h0 M! D
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
5 t+ ?9 [' u4 n+ n8 {1 ~McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units *// }& `+ y" \. {! H0 i
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 u6 t3 V0 }' m, R; b5 ^MCASP_RX_MODE_DMA);3 q# k% g- F+ N+ y2 w/ O t4 D. W
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
: o$ s3 L/ E: p- o+ u9 q( e0 YMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
4 F g! r" M* E4 QMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
2 p/ F! V0 |& ~+ q5 kMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);+ @/ V1 d1 U: L% \
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ! O# B) o- `$ V5 k) c* s0 ^, Z
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */3 C& M. D/ |! k- L3 W9 l
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);% A G( C1 `' C$ G9 V
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
6 [! |1 _( x; M$ i' G! F/ C" TMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
* L) p( d; C c& g9 j( d3 i( [, B0x00, 0xFF); /* configure the clock for transmitter */8 l& r' X- Z: c* K" ^
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
+ ^! ^2 B8 W4 T6 c VMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 7 w6 m. ` r1 T6 {: y/ b0 G. u
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,! ^6 b+ {8 B& I$ }, ~: d
0x00, 0xFF);
- v- F) Y. w; @, H- b+ Z9 |6 f1 v; ]9 a5 y- X0 U3 T
/* Enable synchronization of RX and TX sections */
- m$ O( w z6 Y4 ^+ SMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */2 F+ T* W3 y( |+ |1 G' ]: ]$ m
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);+ h, M- t! }9 H3 r9 ]3 q
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*$ r9 S' W8 @/ x4 v' K( ~
** Set the serializers, Currently only one serializer is set as& P+ G$ _. j) j
** transmitter and one serializer as receiver.% }+ S3 u3 k" E' K/ c
*/0 ~8 I0 K+ x* p+ h% e( v3 o6 W
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);9 i% l) H4 D% W6 k% V: \, f5 w
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*5 T/ n# T, J6 O# {, w
** Configure the McASP pins 7 W' R% n5 R( f& y
** Input - Frame Sync, Clock and Serializer Rx7 @0 S2 T% a/ J6 w0 ^6 C0 r6 H
** Output - Serializer Tx is connected to the input of the codec ' |/ ^. b/ Q8 P
*/3 p) B4 I" R! i8 s
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
0 i$ o7 t( ]- S! K: I" mMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));- H1 ?- H, E0 L2 i K
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
: l0 I, H" q- X, D| MCASP_PIN_ACLKX
( c1 J& [) E6 z& L) C% {* |5 u| MCASP_PIN_AHCLKX8 c# J9 e2 }7 p* r& ~" O3 [- p
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */4 @( m0 b: y2 `& F0 m7 v' D
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR & C& @( t0 H" Z! O4 ^# \- c
| MCASP_TX_CLKFAIL
5 ]$ z4 G) v' L6 {+ y. g| MCASP_TX_SYNCERROR
4 @- D1 j+ X/ J* K* ?0 c M5 \| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
- P' S% ~2 K, f9 }1 z| MCASP_RX_CLKFAIL0 u# A& F0 Y' O. Q/ |; m
| MCASP_RX_SYNCERROR
% e0 q7 }& D& v0 q2 J6 n" a' ^| MCASP_RX_OVERRUN);8 G, F7 F8 C3 }* t* _8 q7 w4 ~: |5 V. M
} static void I2SDataTxRxActivate(void)' R4 n7 B6 R6 Y0 v( ^7 B$ Q- d& O m
{
& B( J5 L& X: r% H: }/* Start the clocks */% [ O; M: J1 l
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);; Z7 w8 w' b3 U' z H
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */! m' n8 t6 O, t5 Y4 J: t( |
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
) V) J! h! a% ]2 NEDMA3_TRIG_MODE_EVENT);" K. A4 c( D& h
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, $ }, \% B2 p2 u: T3 u' ~( |5 t
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */& F0 M- l- m- q7 b3 ^5 G, ?
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);" }. ] m6 I$ I/ H
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
! R' h& x6 H7 D5 E% ~while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */8 ?( x7 F$ { E0 c d
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
/ o% r+ R+ X$ {$ u! c. t9 ?5 c5 b% a4 F% QMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);) p+ d" H% \, j) z( |. Z; J
}
, a+ }, M' l* N( b f% W) h% t请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
4 V- X0 m5 Z t$ x# a: t |