嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,$ p5 @. r3 O3 C8 m& u7 I
input mcasp_ahclkx,
9 H g+ d# y- Q6 f& ?input mcasp_aclkx,& E0 y, f2 L: ~4 i- \
input axr0,
$ M* k. E. `; F; k+ u
8 s3 v: j k& y5 ]0 j9 R0 j' Zoutput mcasp_afsr,7 H! O$ O1 ~% K
output mcasp_ahclkr,
% j; Q( r4 A! R N3 Foutput mcasp_aclkr,3 ]0 m+ }( r6 ^8 {: _ {
output axr1,! i5 ?; k$ {- F& F9 t- Y9 n! d: H
assign mcasp_afsr = mcasp_afsx;
3 s$ t# y, f4 n1 Iassign mcasp_aclkr = mcasp_aclkx;
/ Z6 h- P B3 R. e5 \% Z) Z2 j( N- vassign mcasp_ahclkr = mcasp_ahclkx;
( |6 O% {, E d& c/ ]" N1 `' x5 Cassign axr1 = axr0;
1 ~( Y+ S& }$ \# A2 |# k. ^4 c& O' l8 h* y: r4 _
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
. J( D5 Q; Q: a E5 C4 }8 F
static void McASPI2SConfigure(void)
, ^( j- f7 Y) S8 ]4 ]5 P' `{, p* D$ l9 W% A
McASPRxReset(SOC_MCASP_0_CTRL_REGS);; C8 w1 z( ]" w) H' r, Q
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
L6 \% e* H' S& H) N2 g; {/ AMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
; n7 Z% w/ b9 }, e8 y, ^+ ^McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */. V' G8 m! \% Q# r' u
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
; G0 F& v/ Z/ Z- Z( I: T2 I9 \; oMCASP_RX_MODE_DMA);
3 _9 {* ]8 r% f4 @McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,$ M0 K* z# l, G k p j7 b Z2 c
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */" O4 l1 }; E' C6 B3 z( f
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
4 Q+ N8 o, f9 N* h, p) R7 ~/ X" u7 hMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
: E3 S5 [9 N K/ Y4 WMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, % U9 k0 v. l/ {5 W$ p7 A3 Q
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */" _4 I0 o- ?1 r( o0 l3 C1 P3 V
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);. j8 b! E, k& {/ C
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); k1 H6 c: L* [# E* H& g ~9 e7 b
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
! D: ~/ P8 E! k4 s3 m% X: [0x00, 0xFF);
/* configure the clock for transmitter */" y( H2 k0 r0 L) t) a
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);; t; u7 \ e, v
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
O# V) M* \% a6 T$ Z( d! ^! `McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,; B H: a' X: Z3 \; A2 b3 H
0x00, 0xFF);7 i" Z9 I8 c# s: d
4 M1 T% G Q# |1 l" \: A& p7 @( J/* Enable synchronization of RX and TX sections */
. S3 z" Y/ p' A* B; bMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */2 F0 k. T3 d2 |. }! s5 j9 l
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);! `0 w6 `9 m( H7 `2 f1 j
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*' _0 b9 O: F. [8 e; I
** Set the serializers, Currently only one serializer is set as
; L6 g) u& q0 C* V( S) W** transmitter and one serializer as receiver.
/ I0 E# N- h* l: `9 w- e*/
5 }* _2 H3 A, G; {. q8 ^1 vMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);9 G0 N3 ~# r6 a; @. t
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*& y/ t9 q2 x9 W
** Configure the McASP pins
1 M2 n1 P7 S) I0 Q$ B, C** Input - Frame Sync, Clock and Serializer Rx
+ n- a* q) P9 t9 G( W7 b( P3 g8 D** Output - Serializer Tx is connected to the input of the codec : m8 i1 w7 }, p/ X0 E! o0 ~
*/
( A+ R$ a0 }' f+ b, Q+ TMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
1 w- D8 b) t3 h6 M/ i c& bMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
& @1 f$ L- N# I0 Y; ~" Y8 `McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX2 `2 N8 a! \8 _, u+ B* R: k+ \
| MCASP_PIN_ACLKX
* o8 K" \' O/ e4 D| MCASP_PIN_AHCLKX8 y, M' e! F1 \* b9 ^
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */, D% H9 K, Y% H! a
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
' S& o$ |* ]: M* G| MCASP_TX_CLKFAIL ! I7 n2 W# q; g% R0 K4 L' M
| MCASP_TX_SYNCERROR6 ?5 r A, V- ^8 O# M/ ^
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
* w) R! v. I4 l5 G% z2 v| MCASP_RX_CLKFAIL
0 D, j0 i+ m* w! v' U$ k; q0 y| MCASP_RX_SYNCERROR % Q+ c* C2 m: a/ Y7 _3 J
| MCASP_RX_OVERRUN);
+ Y3 k2 v3 n" }5 u( I9 x}
static void I2SDataTxRxActivate(void)
0 B- h9 i2 L/ Q( ]+ R{
& _4 r: `, X# a/* Start the clocks */
2 N2 _9 Y. @7 `$ v* j, ^# jMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);+ }7 z5 L/ P+ j( T+ ^# m
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
. s; } y! u3 P& B# X) f2 ]EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,, I1 e& J0 A" [* }
EDMA3_TRIG_MODE_EVENT);
# t; ]* [/ n/ e! [$ b% p6 VEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ( u( n) V( _( o6 y$ E, i
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
3 W2 x, `$ e' OMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
( B7 t$ z) E% s2 R- F! e+ l( Z4 K) ^McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
' L( s) {3 i. F" ?while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
c+ a Z' v0 ~* ` _0 R7 JMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
( G/ W4 w& T8 C. x3 G# |: rMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
4 O$ s% n' c6 L, V9 ?}
: }+ r' a1 K* @' ^5 t- s
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
2 B* Y. d$ J$ B
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |