嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
. M, m. b* H! x w5 kinput mcasp_ahclkx,4 ~0 z& R; K0 V/ D i
input mcasp_aclkx,; n$ \4 P6 H* z. u1 @- D. ?
input axr0,
( Q P( H+ ?8 h- n; b% K
' ~, j {1 g; \output mcasp_afsr,! o8 B1 E5 g( |
output mcasp_ahclkr,4 W3 {3 F+ h6 K
output mcasp_aclkr,
1 S0 U/ D+ O5 V( B9 coutput axr1,) L9 `$ k! v+ v' h. z
assign mcasp_afsr = mcasp_afsx;
( c# u' Y/ D; a) Qassign mcasp_aclkr = mcasp_aclkx;# U9 h4 i( V# C `- V
assign mcasp_ahclkr = mcasp_ahclkx;# P3 }/ @$ o# v$ t6 j
assign axr1 = axr0;
- [' m, @+ |5 P3 f% R9 c3 D, r
( F/ y p6 K. \: w0 f+ |8 A8 r1 H4 v
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
, O* @ ~# S' b" D V+ l) pstatic void McASPI2SConfigure(void)" u+ K4 e" Y8 J9 z! m
{$ \# m, ~. s6 n/ @$ O
McASPRxReset(SOC_MCASP_0_CTRL_REGS);% x9 ?7 R2 x% M2 \( Z
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */) t" E! |$ m+ V3 {4 H4 A
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);3 F6 B" Y$ w" s# ]
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
- ~3 W+ m8 f# M* xMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,8 q1 {' g& e: ]: n! _1 l. ]1 a
MCASP_RX_MODE_DMA);
0 r' }( R" M" C; c4 A' ]McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) z1 [ z% l6 F* `2 v
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ o0 s8 P) z2 h
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ' d) x# _+ v; [% h0 I9 O. {$ Z T
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
( w) _; d6 O9 dMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
1 w6 W% d/ O5 K" a0 t# p2 \MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
* H, }( m5 S! g2 L" IMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);0 f% r, ?5 N1 W7 P. {1 V
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 7 R' [* l/ t7 O' y# z
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,4 L/ H2 C# q3 ^: j0 L
0x00, 0xFF);
/* configure the clock for transmitter */
7 [$ }: u7 \% g4 ^ }" m. C6 hMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);( ^, L9 D6 R* z
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
' u: F2 u2 l% e2 F2 ~McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
9 v- z! c$ T6 C# x% K0x00, 0xFF);+ T1 i2 m4 [& w- l# U
. c8 [$ k8 Y8 e P/* Enable synchronization of RX and TX sections */
# J1 c; z: A) G" g/ `# S4 A0 KMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
4 m, v7 U8 M$ mMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);3 b2 [5 ~9 C& O0 G4 ]" Y
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*2 g0 A" e5 ?$ [3 A& e. I; [5 M! n
** Set the serializers, Currently only one serializer is set as1 D) A& [- a0 _, o6 ?9 B
** transmitter and one serializer as receiver.* o! t1 c0 c: X: h
*/- M6 }# \: c9 P4 s
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);9 @+ f& K2 G; ~$ M
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*9 ^1 j# j, {3 X' i& e& N9 w9 Y& _
** Configure the McASP pins
6 p) o; H1 J8 j4 K** Input - Frame Sync, Clock and Serializer Rx
4 q. A/ L* K, _) c& M7 T** Output - Serializer Tx is connected to the input of the codec + |. p& i: n2 |8 N" [( L. j
*/% h( k+ s% B8 m) z% _
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);/ i2 ?& |5 j+ _; E; ?
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));3 H. T, j- j: e% p( F' @ y j
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
# @( ]' v. [1 V7 u A| MCASP_PIN_ACLKX
6 v* L( c& Y p3 r" Z8 X| MCASP_PIN_AHCLKX
& K2 J: B. J. J/ E| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */6 \# `0 X$ t8 {+ H
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
" ?2 ~( E. \+ W! E& L' q N| MCASP_TX_CLKFAIL
" l) A4 h( o) T, B3 {| MCASP_TX_SYNCERROR& ?6 K* C' I/ i
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
n5 y/ H3 p) h7 @| MCASP_RX_CLKFAIL* ]1 i' Q# k) x( A
| MCASP_RX_SYNCERROR
# q) V0 [2 R! H% d| MCASP_RX_OVERRUN);
% Z# j0 v! X3 m" _9 d% X}
static void I2SDataTxRxActivate(void)
2 ^$ n$ _8 R$ N7 n/ I6 Y7 f) e{
5 E; Q( f: V$ u: I/* Start the clocks */
4 b6 P' G, q! k5 b7 [4 cMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);0 l* j2 K5 k9 z4 |
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
" D+ _/ y7 Z) Z' u1 C1 `EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
% l* K! x1 q' |" A, Q& sEDMA3_TRIG_MODE_EVENT);
6 P+ o" `) q2 v4 R& @2 c; iEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
& T2 p: x9 w5 y% y! e4 k/ YEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
8 u0 G( S' l9 E nMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
% ~* K: A% C% w, H$ VMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */% z0 ?& {1 |) F, t" v5 y
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
7 y: J; P" w2 X0 q" b+ r6 xMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
4 y9 X1 u" G% r/ }McASPTxEnable(SOC_MCASP_0_CTRL_REGS);" r2 w4 M0 g( B Z
}
1 g+ j) v9 Q. f
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
+ k9 g P8 @1 r# s/ q7 z- u
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |