|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
2 D" F( H5 z& T l) Q/ q* Finput mcasp_ahclkx,
' L, T q' q4 A; w4 X; S. Minput mcasp_aclkx,
% g' N# h6 P4 ]input axr0,
& S( P: J7 u: p+ f3 ^
- X4 ^4 f6 ^" |# {) W1 k4 Zoutput mcasp_afsr,
3 E' r) @% X4 eoutput mcasp_ahclkr,2 U) U- v: C, W
output mcasp_aclkr,
3 r$ g( q0 c' qoutput axr1,
6 g D! a2 }9 y assign mcasp_afsr = mcasp_afsx;
7 N6 U4 m7 B# M1 n* ?assign mcasp_aclkr = mcasp_aclkx;' {* n0 R: s8 D2 T4 d
assign mcasp_ahclkr = mcasp_ahclkx;6 ?9 P7 P. {/ X z& j. J
assign axr1 = axr0; u9 H- \1 r9 ~5 _) i
& {8 w% F, J& @; y$ D在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
6 L1 t" G2 _4 `static void McASPI2SConfigure(void)
9 R2 W9 v8 b7 u' _1 Z{ F9 O; R7 B$ N: U
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
- O$ t# }0 D8 j, |+ yMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */0 q( \: x6 \" a) s8 Y
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);' [1 V% b3 V; B3 f0 r; Y& q" `! I
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */& H' s$ S2 b! Q1 K, b0 d9 ]( ]
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
R0 Z, Z0 w9 ?5 h4 c" ^7 g+ ]2 SMCASP_RX_MODE_DMA);
1 k3 r6 v6 A. V9 K9 }% ~. PMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% p+ i0 V" L* E5 \# V8 _MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */+ @3 i/ E, {- T( Z9 _2 c
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
: X; g; O1 r$ ?$ Z$ z; z9 w: i5 o5 yMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);/ l% k$ W/ o* L; D" L, x
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
. H" q" h1 h# n' F o& OMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */1 b( a2 h5 U' u1 Z6 n3 t
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);9 r! m& {* x9 ^
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
$ {: c4 Z) \/ N9 ?McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
' x/ o' O- c3 x3 q! e; O+ [0x00, 0xFF); /* configure the clock for transmitter */( T! S: V+ M" B% K5 K. \ F
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);- g/ P4 r- O D; v0 o6 E
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 4 ]+ b3 f6 e2 m
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,6 w: s1 c Y: p4 M- V
0x00, 0xFF);
- l3 t0 i: n# |5 }) T
5 K- f7 ]3 Q2 W; v9 i' f/* Enable synchronization of RX and TX sections */
* K5 g3 c& S% l4 j. {McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
) M- q0 F) o5 T- z$ lMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
0 ?9 P: z# S5 k6 U8 I+ V! yMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
7 M) M; [1 k* _1 ~4 v** Set the serializers, Currently only one serializer is set as
( Q: }$ p# T* c* j! b7 t& S4 v** transmitter and one serializer as receiver.
- _7 t: X# N" n T, ?1 |" {*/
( d# s* B9 _6 y/ [9 i& o8 S wMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
8 x! X! {+ X1 A9 \; p/ JMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*7 I3 }2 R0 q$ M% A: q
** Configure the McASP pins
2 H4 r+ f3 _# L+ f" V** Input - Frame Sync, Clock and Serializer Rx8 v: q2 {& p* F o" _0 P' i
** Output - Serializer Tx is connected to the input of the codec & Z* H6 i* s* [, F: @0 b+ }' h& S& R
*/' d3 K( h" C$ E! t+ Z5 d6 @, J
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
* |) a" U% l+ B( E) ?: s( z# n% {McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
6 C% y3 Z% x' u) GMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
& j# x* O' y, B4 @, G/ \| MCASP_PIN_ACLKX' D. d. X1 A. Z" z- `' }4 ~0 |
| MCASP_PIN_AHCLKX
1 t B3 h& `, S c& s| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
4 L1 T) ?8 i$ }8 L( o+ u% @( WMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR " H1 _2 D8 ?. B' s6 \4 i- w/ X" y
| MCASP_TX_CLKFAIL 8 R2 l3 o/ o0 m# k! J/ N! f0 {+ b
| MCASP_TX_SYNCERROR6 W# `0 ?* n: \" n. M. \
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
0 f0 i7 H$ O) S w6 ?) ? |8 Z x( P| MCASP_RX_CLKFAIL
& b$ K8 _' L& o" X$ J" \! y| MCASP_RX_SYNCERROR
# v* ~" A- s* P) K" \5 ]3 \) v a: z| MCASP_RX_OVERRUN);
- G7 ]/ B, j; i! X2 l6 |} static void I2SDataTxRxActivate(void)1 t% }+ f1 f' H( f! ~
{
2 }% U( H; C7 {2 ?7 |/* Start the clocks */
9 V2 p' w9 x4 oMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);, \. h* Y3 P1 j; h& C# ?* x H( f
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
/ ~" O% |% R5 jEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,/ Y% ^9 W- F( p5 H! ^4 q7 q
EDMA3_TRIG_MODE_EVENT);
( z. \3 Z( i" U8 r: y' s" ~" v2 ?7 cEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 8 a3 I8 @: F: t u
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
; i; V+ o0 P# ~9 eMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);% Z$ K* K, Z9 {# c7 x
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
; V4 U- W3 \8 Y# U) T- vwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */* i9 s+ ]/ l. W0 }; ?% S v1 Y
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
2 h/ A; Y/ y( ~2 p3 {McASPTxEnable(SOC_MCASP_0_CTRL_REGS);& N0 R1 K8 C, O" s! H. S3 z$ T
}
" z$ ^, C4 N1 a- k. ]请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
& L0 y8 @. X! b$ l. } |