嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
+ S: d. c% r5 q( \input mcasp_ahclkx,! d# Y1 j; O ~+ s
input mcasp_aclkx,
' m7 x- b$ D! F Q! sinput axr0,& s2 y. {' H( j( Q0 E2 ^7 p ^
+ t% K9 [1 N% S9 i9 S
output mcasp_afsr, \4 O4 W; n% V, ?: D1 t1 x2 [: n1 j- n
output mcasp_ahclkr,
$ |" H1 p: n1 U; qoutput mcasp_aclkr,) h! B. z/ B4 J! I* m
output axr1,: b8 W( V6 Z! [7 S3 Y
assign mcasp_afsr = mcasp_afsx;" a% ~7 i) A2 P6 e' G$ W" l8 j$ d
assign mcasp_aclkr = mcasp_aclkx;6 I2 N5 i7 M: b4 C0 o8 o$ M
assign mcasp_ahclkr = mcasp_ahclkx;
$ w7 K; [( t- Z& Oassign axr1 = axr0;
5 n m6 p% D8 s' |: I m/ e, z! j
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
% W2 g/ R# S8 L- Bstatic void McASPI2SConfigure(void)
3 L1 u6 t( O. R; b) L' o{
5 P: m5 \: t2 m( gMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
6 L; d, i( E0 u9 A0 M! oMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
5 [! g ?6 L5 a- C8 m. v' m. bMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
# P7 R) ]3 a; {8 Y1 l5 f6 f7 TMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
. q4 C/ Q$ C8 r" ?6 h0 X' ~McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,# y: g/ m1 B6 L4 I/ ^" J
MCASP_RX_MODE_DMA);& j7 u4 A3 R( x) e( C* v
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( d! t* Z! f- I0 V% y$ L; \
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */' Y5 U' n0 p* M: F7 Q7 F3 x
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, # I' `+ G( W' X4 b
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
# Y- [: D$ z# w2 x; B) {McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
/ f; [7 t. l' cMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */# ?+ n# w& W. R$ {0 g' F: x
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);- D' Z+ A8 b) X/ R
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ( D( e( p. @: f/ Q
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,! u" H0 F, p( c7 ?/ T& V
0x00, 0xFF);
/* configure the clock for transmitter */
& L1 @0 k+ U" yMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);: [; g8 L; n4 G
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
, O3 G. t) @0 Q9 w5 F* `3 _McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,0 J( M; {8 @/ f' z/ m; E2 W( M
0x00, 0xFF);2 X2 r* k2 [. ^ h# X
3 I4 G& V# c% b0 j1 Z+ y8 Q" Y3 @6 \/* Enable synchronization of RX and TX sections */ ; {3 u* x6 Y2 c% L% T( s
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */0 Y* w: D$ p$ E- {" T& Q7 ~
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); p5 X1 c2 q" K5 @
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
* P0 L6 F# h: G* |6 P/ G4 Y2 {* r** Set the serializers, Currently only one serializer is set as
3 d: T/ O: b* L$ P; @** transmitter and one serializer as receiver.
" P g8 ~0 z5 W6 Q6 ~) ^ i*/
, j0 K |' A- [& t: YMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
( ~1 p2 n8 j$ Y6 hMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*$ x/ y1 c. V3 a5 Z- c: U
** Configure the McASP pins
6 o a! B! m3 w** Input - Frame Sync, Clock and Serializer Rx0 O( _) h* d: a" ?
** Output - Serializer Tx is connected to the input of the codec $ i! r. ~- h4 d. T. n- x
*/* g: [; d5 Q! ~% K
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
2 p$ Q$ z* b* Z4 ~6 T5 | `McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
# M7 G, J& [. J0 PMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
. c* b1 o* s1 X: Z4 W| MCASP_PIN_ACLKX
: w: H; H4 a+ {1 Y+ A, || MCASP_PIN_AHCLKX7 F f* c* m" P
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
* e$ I e) k1 g# b5 i1 x9 MMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
& p: F: G& y7 \| MCASP_TX_CLKFAIL 7 O$ k0 u: S% n
| MCASP_TX_SYNCERROR
$ ?3 d# y6 R6 f( P| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR / v. P- S8 g* w+ P1 b8 V- H
| MCASP_RX_CLKFAIL
* c' E4 c+ q# c$ k7 ]| MCASP_RX_SYNCERROR
' j# S; \3 Q: n8 r$ c+ |1 { J| MCASP_RX_OVERRUN);8 U% V9 @6 D$ r/ O3 ~
}
static void I2SDataTxRxActivate(void)) V; c5 D" P, B5 W5 q- G9 c
{
7 @ l7 x' I) f3 ^& l3 x/* Start the clocks */% `4 p9 ~6 n3 ~
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);6 i- N4 r1 L; V4 S
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */ s. h0 S: W' {2 O: V4 b9 U/ R2 y
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,' C" U C. Y+ S- P
EDMA3_TRIG_MODE_EVENT);& l. f/ U7 @8 v( _& N3 b2 E
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 8 N( u- C$ ?9 b; j( M1 ]/ V6 G6 @
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
; \7 x- ?' j, R |McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);" Q: l- e- z1 E
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
4 r3 N6 [9 l4 y2 ^" B7 Mwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
/ N6 ~- Z2 M' M/ p1 _- h4 UMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
% m. u9 I& }1 `& k7 ~McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
7 N m' m0 {0 p; z* T* @3 d, M}
- F( ?8 |! s1 O( ~7 V" k a6 r请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
2 r c" R7 ?% s1 \: M
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |