嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,8 |3 @$ I6 E% c, V( Q* r" u. P
input mcasp_ahclkx,
8 h8 P! o6 }$ `* [input mcasp_aclkx,
2 x9 \5 {6 N# x; p# ]input axr0,1 D6 W3 j4 l3 x4 Z
! S4 o1 }; r6 i9 R0 o
output mcasp_afsr,5 ^; s) F8 i. c% H
output mcasp_ahclkr,
* U/ o" p K- y& i# a1 O/ toutput mcasp_aclkr,# S% ^9 O6 H1 g$ k$ h- P
output axr1, F% O: u! E7 Z) x4 [
assign mcasp_afsr = mcasp_afsx;
* M0 D$ R1 b& t: ~5 H) zassign mcasp_aclkr = mcasp_aclkx;/ a$ p4 P R7 C6 |& e4 R% d3 k# r
assign mcasp_ahclkr = mcasp_ahclkx;7 O' E6 g7 S/ |- y$ Q: F' Z
assign axr1 = axr0;
$ Q1 o$ h! e( _, \
5 k; b4 W) H. e! `5 y7 v在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
: Z" L4 p" f5 { B/ r- zstatic void McASPI2SConfigure(void) D* a7 S1 T7 ^. e1 W) u
{
: s, _8 J! G# ?+ ^+ r& i6 M( ^McASPRxReset(SOC_MCASP_0_CTRL_REGS);* b6 ~8 Q3 ~! e3 Z6 R) ~8 F) H; M
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
* m3 p( r" k# w/ j+ hMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
3 D' A r( u( M2 KMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */ ` O# q$ `- @1 x
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ W. Y4 Z4 A( N! C# GMCASP_RX_MODE_DMA);& M% A9 z+ j0 V0 b6 \& q
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 ]1 n8 e- y, A) LMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */7 U$ k6 Z- U+ S0 e4 |, z# q1 I
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
5 t3 |& w$ _* bMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);* s! |! F0 V9 s5 S: q+ z2 _
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
: A7 w" t4 m; g# J4 F4 SMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */- E* V; H/ F. z @2 V7 o9 A
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
! o/ A$ r7 E n+ G6 \8 YMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 7 X! b( R, e8 `% q; D6 N9 P- R/ i8 h; ]
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,/ t" ?$ w: F) j& E
0x00, 0xFF);
/* configure the clock for transmitter */6 q# p8 N0 z$ |: v3 ?
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);$ l% h, f3 N, e* C) v) M9 p1 T+ i! ?
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ' X5 M3 X7 f8 d5 @/ {% X
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
) Y% O+ H( B# g$ X0 V0x00, 0xFF);
, P" v) X* E1 I( i
$ F! d. y6 _" _3 {/* Enable synchronization of RX and TX sections */
& G& m' h) C G1 [0 p8 o s' vMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots *// T" r2 d+ | w) r8 I* Y& O
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);9 y# F3 `: i! G5 y
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
* t5 T; B& i; G/ V** Set the serializers, Currently only one serializer is set as' V( ] E* h2 k/ F' E/ u$ O4 d
** transmitter and one serializer as receiver.. U1 {4 |' m) T( ~2 \
*/- x& Q4 O9 C3 N L
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
- Q6 i9 Q% i9 {/ v6 L( e4 yMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
3 |- t) b; s0 X- a" }** Configure the McASP pins 7 u& V8 z/ A0 z* |7 E
** Input - Frame Sync, Clock and Serializer Rx8 j3 x5 m7 [! P% O
** Output - Serializer Tx is connected to the input of the codec " y# M. A+ p) M" o3 a+ B2 a
*/- [3 ^! U, W- a% F
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
9 b* ?0 l; u" d1 XMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX)); _/ n) t0 Q7 r7 L2 p# U( E- [0 v) n
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
6 V) M7 S7 H; ?$ v! s| MCASP_PIN_ACLKX
/ t! C8 R+ |" D4 b& p4 S* {| MCASP_PIN_AHCLKX' D+ z9 R% b3 j" u/ o9 c0 a9 ?
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */* }: f8 b# {5 \
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
3 z8 J+ X( H: M: S* e: y, \7 {| MCASP_TX_CLKFAIL ( P, `! Y/ f. j I- l5 x) ~
| MCASP_TX_SYNCERROR
$ v* ~" h! E( x% U) E' f| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
3 G( @7 k6 \. R) d2 K| MCASP_RX_CLKFAIL/ |" u$ h# X$ M1 E
| MCASP_RX_SYNCERROR ) O2 T) s2 u% j; }8 ~9 ~6 p; x/ F" i
| MCASP_RX_OVERRUN);. n1 g5 N5 p/ [
}
static void I2SDataTxRxActivate(void)/ m$ q; N& f0 s7 B5 ]
{5 y- w, q1 d5 G" s+ B( J
/* Start the clocks */( Z; W3 i! X |/ j x% G/ F9 p3 f& J
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);, V1 T( E: V) t5 i. D1 [4 W0 r
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */1 v" V( P+ f [( M0 i% X7 Z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,9 ~# L( ?, o' z, o- @/ t) Y( r
EDMA3_TRIG_MODE_EVENT);$ N' W$ B# G0 }1 x, N
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
+ u: d6 q3 j/ O- q8 n YEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */2 I! b' _9 F1 G: D: A
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
' o% O0 Z! l& Z2 d) {8 N* O% }; ~McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
" M9 a% y/ P8 m' Zwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
+ P% I7 k' S% I: w, O5 X$ w) eMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);+ c: S5 J& ?4 W8 { e7 }
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);8 @+ c7 m3 U# K6 k
}
7 d% b% r9 N# F9 h- X3 \请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
+ @0 ]$ C, C- J2 K' o1 T' M
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |