嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,0 W- L* g) z& q0 I
input mcasp_ahclkx,; Z9 @. M% s5 b N! A" g e9 z
input mcasp_aclkx,- J% S" @: j: l5 x# H3 K
input axr0,8 h7 d8 d6 H) N& _
/ O6 ~; M( U/ V4 M2 ^ Toutput mcasp_afsr,7 u, V4 X/ n' i( q$ G0 e
output mcasp_ahclkr,
* [+ Y0 g" i9 ^- R$ J) M+ _3 A7 [: _output mcasp_aclkr,/ |& y% k; r" m, r! G
output axr1,1 k% s6 M5 g0 V: N7 @, ^
assign mcasp_afsr = mcasp_afsx;6 [( K( Q7 [" _, O! w( F( p
assign mcasp_aclkr = mcasp_aclkx;
3 W3 P1 ?/ L' R1 vassign mcasp_ahclkr = mcasp_ahclkx;
+ X* f2 I Q; X9 i7 c: O* passign axr1 = axr0;
! t, H6 s& T# l( Y$ I
& ] X' S# b' A( |; x- s. p在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
9 v7 ^# V- e. S. r' Q: o: a
static void McASPI2SConfigure(void); H, q3 T+ r; `. M/ K7 ?+ T
{" [& o7 _$ @. y( E
McASPRxReset(SOC_MCASP_0_CTRL_REGS);) D4 c: Y8 H# l1 ~/ w; R+ i1 H) }
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */# o% a0 `) s) }$ W
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); @' D w; N5 U) s
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
& o2 K8 W; ~0 o: T0 b0 p! kMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 z" z) d5 d, n& k
MCASP_RX_MODE_DMA);
) M$ h t: J. K9 H5 }8 VMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
r, }' X0 a- }/ S! D; q4 u. dMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */% F6 l3 D4 O5 N9 ?& c
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ' E3 n- B: W2 U
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
% g/ i7 c& R2 R! CMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, # U a/ l# m2 z1 i1 d
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
4 ^$ u2 G; `5 @+ n) `2 O4 g& fMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
) ^' U3 ]- A2 L: ZMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
( e5 u: n7 i1 _4 x* SMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,/ U, ` B) @+ p1 q# @4 |' V
0x00, 0xFF);
/* configure the clock for transmitter */6 g1 b( y, ]: K5 w; b7 e
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
/ R6 C2 V( l, G' dMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); " u, n& v# V. s
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
, k/ O0 m: R2 |+ S9 s X1 }% @0x00, 0xFF); t0 B9 J1 c! ^) A% ]% t
% x+ }6 A1 F. V& G/* Enable synchronization of RX and TX sections */
9 H" ^; e5 ^+ } X4 ?$ SMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
6 R+ z7 X5 ~ t( T' \McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);) ?1 H# ] p& d; P+ N
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*- w9 e' H p' ^+ F- _: u
** Set the serializers, Currently only one serializer is set as% @; }" F' d7 J: c# M
** transmitter and one serializer as receiver.8 t, U; G& v! L! W" c3 ?7 p
*/8 S$ e7 P( E1 ]( V" C: z6 a
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);8 r. x1 R3 J$ r7 k9 Z
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
; E6 U2 a. m2 u** Configure the McASP pins 9 f2 A7 z/ b" y/ H, K8 P( J `. e
** Input - Frame Sync, Clock and Serializer Rx
T- E) r: x7 w** Output - Serializer Tx is connected to the input of the codec 9 e$ I2 G O+ m) s3 w
*/" g. s( a' k% b8 B- B1 @
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);3 g# }( a$ c# H
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
' j" x w; W! [$ BMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX* m$ d" C# r' y
| MCASP_PIN_ACLKX! V& A% V6 q+ i
| MCASP_PIN_AHCLKX3 _ H6 u; S; N3 K$ T0 B
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
3 y) z" g4 \ Q" Q. [7 @5 A: pMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
% p( y3 n1 r7 ]/ Q. a" j8 `* L. m| MCASP_TX_CLKFAIL - ^$ S1 v* R- S) }
| MCASP_TX_SYNCERROR
; ?+ E* F, x! Q7 F8 e$ Y( }| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR & I3 Z$ c8 P3 p) j3 p" ?& \) o1 `
| MCASP_RX_CLKFAIL
' Z! Q z0 Y* L7 E% J" F% ~$ Q$ N% M| MCASP_RX_SYNCERROR
! {- l; { D1 P* Q| MCASP_RX_OVERRUN);% N4 a) [; O/ f" P* g
}
static void I2SDataTxRxActivate(void)$ j: h. D3 i* |% _" |
{
6 a& A: A; f& A/ y- D: ~1 s/* Start the clocks */
( A8 s7 I6 g4 R9 U* ~5 p0 Y8 M: vMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);3 {) ~6 c, _6 x- I' U
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
! Q0 ?& _2 N) tEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
( k1 c, ]$ L, N# A: \; Q* N* _- pEDMA3_TRIG_MODE_EVENT);
5 D* V8 B( Q- r; B) |EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
& S0 o/ {* Y5 TEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */) e! L0 M0 {& d9 t! a
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);! d2 }; U2 X* I$ {
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */) @; l% ~. U' w/ d8 q C' h
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
3 y: s/ r: w: o4 i3 C( l7 `McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
% G& l Z! y8 v8 x* }7 OMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
3 k! d' B$ j- @5 M! [8 N}
' h5 H) g4 d* k. Y$ g
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
2 X: W& u6 r, V5 v+ G
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |