|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx, u# M- o* Y5 A7 Q# O$ M
input mcasp_ahclkx,5 H/ }; S9 }: |% Q3 e
input mcasp_aclkx,
6 x/ [+ t0 a" ]2 D3 i+ U2 P( Uinput axr0,* o+ V! R3 _% [+ n7 i
+ z1 Y H6 ~& o6 @8 Y/ S
output mcasp_afsr,' \, r2 \: H4 C6 E/ B2 m' b+ U
output mcasp_ahclkr,$ ]# B: D Z/ d6 n/ r
output mcasp_aclkr,8 T! r/ q' i- s
output axr1,
( g! |+ |2 ?# E. g assign mcasp_afsr = mcasp_afsx;/ V4 [2 s6 @) z6 O9 a% E: P
assign mcasp_aclkr = mcasp_aclkx;& b/ ]4 z* W% l1 j: H# Z+ x
assign mcasp_ahclkr = mcasp_ahclkx;
9 d8 P6 e R0 q6 Sassign axr1 = axr0; % S" B% z/ `. y; b) F" A u; i7 I' v
; M& _9 \4 S5 d' h" G; e在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
4 R! q$ Q3 c' m* d' [$ T" `static void McASPI2SConfigure(void)
1 V9 ~1 o3 Z0 O, d) d U{
, ? N+ `9 Z5 M3 F; Q; J0 EMcASPRxReset(SOC_MCASP_0_CTRL_REGS);$ \8 n3 n* W- U$ O; v8 Z) U
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
% d$ n. a! `9 C! }McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
$ E3 W% p3 H% }. [6 O3 nMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
( u; Y8 y6 C. W" B: `McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ B' A6 o7 [3 Q8 X3 @
MCASP_RX_MODE_DMA);
$ b5 p+ T) a7 E) m5 UMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,8 U/ p5 D/ j, `% @. C0 W' n$ F
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */- R+ ], K* F& j+ T% }
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, & q% t n, Z6 ]% k* V0 c
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);" F+ N h1 S2 b+ P
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
" A1 m" Z8 w, N T( I9 PMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */3 M( B9 ~# b: T
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
5 |; \4 c" j% F% ~McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
( D4 Q1 z. B% zMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,/ R6 r# d6 w# q7 T3 L
0x00, 0xFF); /* configure the clock for transmitter */
- ~$ S H9 L( U6 q. p1 h+ O7 @McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
4 {. ~# m+ S4 S" N* ?1 YMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
( Q3 T& ^& X! U- ^McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32," [8 z1 c. D9 b
0x00, 0xFF);$ V0 C$ i. I( @5 g' X3 d8 E5 x
7 Q, s' z- U8 C8 k/* Enable synchronization of RX and TX sections */ ; i! b( w1 J' V1 W! M
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */7 J7 t" L7 a( w; g* k
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);3 F. q$ h, I/ ^' J. H
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
; ~" |( N! Y4 q) x** Set the serializers, Currently only one serializer is set as
- h, K. e8 u m** transmitter and one serializer as receiver.$ Y& L& l8 X/ h4 e& L
*/
- V* h' b' T. NMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX); U* v0 o6 X+ B9 h9 T% ?
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*. Z9 o! F2 o( ~! @+ v
** Configure the McASP pins
1 O$ m' ~' l; _0 D4 L3 }6 _** Input - Frame Sync, Clock and Serializer Rx' V' _7 p @6 e' n2 c
** Output - Serializer Tx is connected to the input of the codec ' }( a9 _! F) u0 g) r% |
*/
$ B+ A9 h2 X6 d4 c6 C2 ]+ AMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
- F, f. E. j2 `1 ~( LMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));+ I- z( E. [4 v5 n5 I6 T+ \
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX* I8 n# V" W$ {7 E0 B) U
| MCASP_PIN_ACLKX
5 m- T0 M9 b& u| MCASP_PIN_AHCLKX
0 p. s4 R. W5 Q| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
% O7 P$ b( [! F4 }- _7 ~McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
6 d0 j1 Y4 E5 c& b @- H* r| MCASP_TX_CLKFAIL 7 x1 Z' R: F; E( b$ i( S3 d7 ]( d
| MCASP_TX_SYNCERROR
& ^+ t/ C% n; d; p$ E| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 8 F6 a# M; G* w! V6 m8 {, L4 X
| MCASP_RX_CLKFAIL7 c' i% }, w2 @* R# l# ]9 u( i1 A. P
| MCASP_RX_SYNCERROR
. t% T8 h0 Q" K3 V| MCASP_RX_OVERRUN);
9 t. J) }) r5 a* k J* V8 I4 w} static void I2SDataTxRxActivate(void)8 c- ]/ L9 i. H& d3 k
{2 V r2 F( [$ [! X
/* Start the clocks */
8 x2 a$ b% L2 d# c7 k8 hMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
, X* z, E6 m bMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */6 n1 e; W$ M. Z7 p/ n0 Q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
Z y" N5 P! g: J; h" rEDMA3_TRIG_MODE_EVENT);
1 R3 C% L# w, Q6 @EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
) V' ~3 o9 y' F) {: d0 s/ g- k1 dEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
* d+ ]* p1 C) A9 x7 ~* N6 U8 oMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);, q9 L/ t& C! y9 Y8 K
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
- }: i+ Y( r0 V# H& l! Iwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */! e9 ^) `9 l M/ g& u; j3 t, p% P
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);% Y& Y9 E/ G) V7 M g# ^: Y2 q# \) D
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
! _4 _# k; n4 ]* k} . U; n: \2 L, T) t/ V
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ) B7 {( l* d& ]% ?
|