嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,% @$ {% E8 b/ Q% z+ t
input mcasp_ahclkx,
# P/ z2 t9 N$ j/ @ i" [5 Iinput mcasp_aclkx,
4 B) \& ^ A: E6 _( ^% sinput axr0,
8 u3 f! G) a7 D: g# \* q4 Y
# X0 G4 X; u- J* i) ?5 \, O4 eoutput mcasp_afsr, l' W4 n% G' P9 V. M. G) T- D
output mcasp_ahclkr, H. P# U S. V3 S7 H4 B, S
output mcasp_aclkr,! w: u+ N& J; @1 w; ?+ K9 ~
output axr1,
k; j: R( `9 g/ Q% u
assign mcasp_afsr = mcasp_afsx;) i# s. d7 l0 E
assign mcasp_aclkr = mcasp_aclkx;' U8 N2 V. ^1 C
assign mcasp_ahclkr = mcasp_ahclkx;
3 P; _" h! l" l. e( Rassign axr1 = axr0;
, ~" |! F' {: \/ F$ f) l3 N& m2 D- R, W
6 _" M: d2 ]: X x' m在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
+ `% O j) [, L4 D; Ustatic void McASPI2SConfigure(void)3 E5 u, o1 T! G W
{
! v$ `4 E$ a c9 J- I- p2 |" PMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
# y. Y/ o' F5 n' V, x- }! E( B+ K( S8 C% lMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer *// @( G4 P0 l. b, s; g; u% Q; Z
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
# H, {( Y1 X" V2 M3 r" C+ PMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
6 w7 E8 X4 B- [% }" o# |+ J6 P' R0 SMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& n; k9 I0 K$ p6 D2 YMCASP_RX_MODE_DMA);
! E4 L/ W- |: g% I" n% c( UMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ l, _2 p/ [, P( `- F5 k+ kMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
/ T( F. h! r4 B3 {McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 1 _/ m' E- Z0 ]* a
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);6 Q. b7 ]: C8 ~- S! `
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
1 U k* w. O$ k6 P8 r" ~3 f) zMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
" u) w! ?6 R$ m; Z7 P3 j# k |McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);; N i1 B! Q! g" c9 b7 p/ F
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
( o/ K3 k! n* P2 V2 L. xMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,: e% \+ Z+ G- \# C$ w
0x00, 0xFF);
/* configure the clock for transmitter *// }$ v0 c7 y4 {- f+ F) d+ h* f
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);8 N; Z/ j7 m! K0 O, M( {8 f8 a$ ]
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
) ^( O. ^! ^; l8 e+ O& HMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,; M5 @" W% L/ q. u3 }9 C0 n
0x00, 0xFF);! F- Z5 D3 f- v% D' T/ X
( K B% {4 ^4 ^9 V: y/* Enable synchronization of RX and TX sections */
6 n4 l2 I2 Q9 O" b" {McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */* F0 o& s. a5 n5 |
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);# L& S# ]1 p+ m. R* [/ k6 o
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
7 q9 q5 m3 U3 \3 z! E** Set the serializers, Currently only one serializer is set as# R. W% [. Y, o' O$ P
** transmitter and one serializer as receiver.9 D1 T9 q9 X6 f! U2 r
*/
1 l$ b ^- `! WMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);% b, k* v' V5 A) f" @2 I, F
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*4 z$ d$ u4 o( c
** Configure the McASP pins 2 ~% L8 h+ r( F; g+ z
** Input - Frame Sync, Clock and Serializer Rx0 X: v/ V7 w* A, d& M& R' T
** Output - Serializer Tx is connected to the input of the codec 8 }: c' z3 ~ b; [6 g
*/8 @7 `, J# q* Y, Z d( i3 ~. N) _
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);0 F3 q& ?) G6 M' q
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
: t5 _, D0 D! P* ]+ KMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
/ M% V2 g9 t( ~: ^& p| MCASP_PIN_ACLKX
! W7 y; F, j5 w2 \ ]) }- A| MCASP_PIN_AHCLKX
: W. h4 y7 R6 t* e' t| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
7 b' b- b; W! q* V2 P3 |McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ! C+ [: r$ h" O2 z. z1 n
| MCASP_TX_CLKFAIL $ g( z7 c" }! p; D- l& V
| MCASP_TX_SYNCERROR9 \0 L4 D0 [4 `* g! T; ?4 V- Y
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
& B; M( G6 q( D/ J8 F| MCASP_RX_CLKFAIL8 k h. x# C8 v5 c% H, p9 {: D) {
| MCASP_RX_SYNCERROR + }2 M* E' F- Y% i2 \# r, }
| MCASP_RX_OVERRUN);
) g* i d8 u, j( U9 J( e7 Y9 d}
static void I2SDataTxRxActivate(void)% F; Y, P* M. o/ Y9 U
{6 j9 U3 e$ H4 ?
/* Start the clocks */
, I; S/ {! \/ c; E3 d3 RMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);' _" R$ t: ?/ H n$ T6 w
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
. q: U1 \+ ~5 U- W$ |/ A+ w8 nEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
0 ~1 Y* p3 u5 ^, ~4 z0 Q0 zEDMA3_TRIG_MODE_EVENT); X" g( m7 ]+ t! E/ V; {
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 2 K1 X" K! F" ]- w
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */# T9 I) I4 n d0 n; P
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
% @; s# {' ^' O2 M% [3 H) MMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
) ^7 D3 x4 Z; F( vwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */$ o( L$ M& E2 f5 @' \6 N
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
7 ~( t, I1 _, T0 H: h4 X/ ]9 f5 ^9 V. AMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);% _7 l4 x' \/ c8 V
}
& G1 j, W) P3 T. |/ `# G请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
; R# R3 e9 c" c0 M2 z
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |