嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
, V1 K. r4 p' J, t2 }) Iinput mcasp_ahclkx,0 ]/ w* G& V1 H' S; t
input mcasp_aclkx,
1 Q0 Y* l5 A$ oinput axr0,% L2 Q; E6 n: ]% J
* t8 p& O4 p% ?' Y2 Xoutput mcasp_afsr,
& V7 i7 x# F8 Y- }6 ?2 y1 ?4 `' `output mcasp_ahclkr,: }$ {2 C6 E/ ~+ s; h
output mcasp_aclkr,
6 e, o; d2 e, ]4 c3 ]0 m% j) N7 q4 Joutput axr1,
* R& l: S) c6 A5 i
assign mcasp_afsr = mcasp_afsx;8 l7 U V1 D) @1 \# ~. ?% h
assign mcasp_aclkr = mcasp_aclkx;: d7 c4 o, k+ z: F2 {4 ?
assign mcasp_ahclkr = mcasp_ahclkx;
$ n) U* n& q4 L0 {assign axr1 = axr0;
7 N8 K9 M9 C+ [' ?3 y% z* }( y7 W: G5 E: p
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
8 {) _7 K. Y, T- p7 N
static void McASPI2SConfigure(void)2 u8 @2 _' D% [( q/ z4 G) }
{
4 U1 |$ s2 {" a. J( `McASPRxReset(SOC_MCASP_0_CTRL_REGS);
- K8 Y D+ t" K7 h2 N' HMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
! Q9 {: l) `6 ?5 T! aMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
' W. o8 w' ^) E' J6 CMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units *// I5 P0 H) a4 y3 r( E8 d5 j
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ f) r* j4 K r3 e4 h8 V9 X
MCASP_RX_MODE_DMA);/ M( I8 U* U) \. R' @' c" m
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 R9 ?! l9 J' W- o3 L& H( N y
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */- ~8 e' X* F. m, C1 @1 Z
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
/ P v5 x# u, y" |! w' K% w, ?# qMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
4 x Z$ r( ^+ h" O; @7 bMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
( \/ D# g/ }& p4 }MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */+ V0 I" v! \/ ]% I/ |8 \& m) N
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
& Y4 u1 F2 G& q, A m: n! G- XMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
' N" q) D3 t; X `McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
0 L6 v% J$ h: }( ?' P, g/ Z- z0x00, 0xFF);
/* configure the clock for transmitter */+ {2 i2 ]$ w1 y3 r1 Z2 N7 q
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
- E b5 K( V2 @0 |+ B; C7 yMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
: k! @- n) {9 hMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,3 z+ b& P7 ^$ Q. P7 t q
0x00, 0xFF);
, O/ \ O7 F5 K, q3 ?3 J% a1 y/ O9 o% Q( d& k$ [: E7 s. N
/* Enable synchronization of RX and TX sections */
1 @; w, Z% I7 g( T1 `" R4 BMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */* |: e, H" q: u8 y
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);$ Y. r; l/ @) x1 j' E
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
$ u, u+ t; W) ^8 G( @5 N9 b** Set the serializers, Currently only one serializer is set as/ S' _3 s0 v# T; |
** transmitter and one serializer as receiver.
$ a1 h/ }, R- k5 r3 Y8 d! X*/
( }3 q, x! h8 _7 cMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);) L/ X( M4 D! g9 e) M L
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*. ~5 U6 B* _3 I6 s9 s
** Configure the McASP pins ; w/ s8 ~9 i( j
** Input - Frame Sync, Clock and Serializer Rx
/ i J. q2 Q1 [, i4 i4 A** Output - Serializer Tx is connected to the input of the codec
4 K. w- W$ D# @- |% d*/
; c* Z0 R1 Y' c7 @McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);# V4 j h+ s4 T0 y# z% U) C2 k6 ~$ \: p
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));1 i# s4 t, T, Q, Q' }
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX7 j: s) h" U: @1 w5 m
| MCASP_PIN_ACLKX
8 y5 j- C. q% [) x; y; ]9 S4 t| MCASP_PIN_AHCLKX6 X+ L& N8 R* E8 s. v
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */$ f$ C0 h2 X8 X
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 9 x i8 F' F% H$ w* d) k: C
| MCASP_TX_CLKFAIL
" d8 s/ N4 [8 ^% r8 N7 {- k& g* I| MCASP_TX_SYNCERROR' Z2 [- t# d' \
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
5 _7 T& U) Z7 B, m5 \& l4 J1 o, o| MCASP_RX_CLKFAIL; C- w0 w8 s' d8 G
| MCASP_RX_SYNCERROR / O: `( M+ [1 k7 ?
| MCASP_RX_OVERRUN);3 g: C# u% ]* |/ ^8 T
}
static void I2SDataTxRxActivate(void)/ f% J5 K9 Y1 P( u& S: w1 r
{
# e1 l& @ E; F7 i) y7 m2 b7 z4 B/* Start the clocks */
s5 H- f2 T1 Y! H* W+ IMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
/ i, G6 t$ P9 ~2 j5 q$ |McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
, T$ |% g& p$ r. H3 p; @EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
) u. T. A3 J h0 MEDMA3_TRIG_MODE_EVENT);( U. P; W; i9 Q I1 q! s* X6 J; ]
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
, R2 B9 Q( A+ o* Y& LEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
5 M+ r1 D% }9 ~4 Q3 z U4 e' IMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);: K% M6 ], e: n g
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */. g) M( t5 w: Y: n8 s
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */9 q. M4 G* R2 E+ i! {( h) w
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);6 B; a, H, R; m6 Y% K/ t
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
, `4 ]/ R# A; Q$ e% t( s! z$ y}
+ \' p# X+ {8 C. u. T请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
1 W1 Z4 ^+ g9 Z5 ?) B9 N1 ~
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |