嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
0 T! I; V, y8 k' i$ J) dinput mcasp_ahclkx,& b D+ D' V/ U
input mcasp_aclkx,
6 ?3 `" j( E& g4 x- P; R3 Cinput axr0,6 {+ Z" j4 Y- t7 m n ~7 C
7 ]' R% l( g' d. Q1 Y# uoutput mcasp_afsr,1 x, _% v7 V1 y. Y" N
output mcasp_ahclkr,
5 G. i N. U$ s7 p0 v: ^ g! youtput mcasp_aclkr,
9 E2 M t+ |) j. S* eoutput axr1,
8 |! s4 n5 U% p$ F# \
assign mcasp_afsr = mcasp_afsx;( e2 c2 J2 a3 L% w+ v1 x4 r
assign mcasp_aclkr = mcasp_aclkx;
' z! G: M ^$ D5 bassign mcasp_ahclkr = mcasp_ahclkx;
0 B. r8 P5 [1 t# W( s2 Lassign axr1 = axr0;
6 V! |2 ~) s$ }; a. m a
7 k' R$ C' j9 V& j, V在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
1 Y" S, E- {) [- Y
static void McASPI2SConfigure(void); G7 W. f ^5 p
{# H* p! p, O k; K* ?: ?6 J0 [# S
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
( I# f5 V! ^ R( I- x* jMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */+ |3 T7 b" Q% p9 f- s5 z" i
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
- Z. S" |" w! I; L/ ?, J8 _& qMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
3 d2 U c, \6 i3 D- w/ D7 xMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 P* s! W+ M C. A- {$ q1 `% jMCASP_RX_MODE_DMA);
$ I8 I- _0 N) \) A. l* z5 @McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 K/ |0 v4 \& L+ L' V# PMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
. r. f* s3 b4 `6 f! ?' GMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ! | E0 ^" F3 |8 i( Y' h% a
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
8 E$ C$ W& T' [, fMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
2 z2 `& \/ H. t. }8 v% pMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
9 Q6 T; P! t/ y, SMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);. N4 T2 c9 f' F% w! o# q1 j9 b; j
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 6 H7 `0 z: t C0 [: \8 M) g3 r
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
/ ]& g$ ^/ i* ~7 [3 g0 v5 | l+ U0x00, 0xFF);
/* configure the clock for transmitter */
2 X% ?4 ~; V- O( e6 DMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);5 t; Q0 ]3 d$ L, f) f) {
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); " ?' {! O+ g6 J( [! W
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,/ j/ w$ `: h# L
0x00, 0xFF);, [" m+ `, K5 o. t, e5 D" Y
8 J* q/ V( c( E1 y
/* Enable synchronization of RX and TX sections */
9 X a1 ?% N+ S: F: A9 ^McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */. i/ W; z- _3 a$ J; e% R4 t
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
J% f! D- g: Y4 A! G. tMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*( P: ~+ P7 i) W0 @: u9 ?& k
** Set the serializers, Currently only one serializer is set as
6 v& @ c& w, b8 l- S( [( Q** transmitter and one serializer as receiver. z; |6 b6 b1 m3 w
*/# W/ h+ Q0 A0 ~ E
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
; M$ I- d0 k+ y1 ]+ G4 \& m1 r. ~McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*: t. v6 d4 A; Z0 O
** Configure the McASP pins 3 H7 l4 M* x2 V
** Input - Frame Sync, Clock and Serializer Rx
* V' `) m2 [: C4 ]9 s. s** Output - Serializer Tx is connected to the input of the codec
. Z6 ^4 j, c( \*/
) T; G3 b% H% S/ WMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
" \7 _2 n1 F6 i) Z/ O' [McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
! q5 a# U: D/ W- V6 pMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
. _2 f( X3 U6 ?+ R5 K, I& [| MCASP_PIN_ACLKX( Z0 G9 X7 ], z- [- i# e+ {* I
| MCASP_PIN_AHCLKX+ c$ I& h( `* s5 h! g
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
. l$ ^! I! L/ e" o* G( nMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 0 }* u+ |! ? K4 m
| MCASP_TX_CLKFAIL 7 Z; m/ H( W/ I9 T2 S1 a
| MCASP_TX_SYNCERROR
) `& x; t6 @* R) |1 a K% l3 C% p* A" M| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ' h" f. x, O/ Z: r% n; T
| MCASP_RX_CLKFAIL
F# K; Y" y. `! E0 f& l| MCASP_RX_SYNCERROR
7 ]4 o8 c% u0 Y, i* {" Z% V+ n& q' N| MCASP_RX_OVERRUN);
5 {8 g }' p' Z3 |}
static void I2SDataTxRxActivate(void)5 l# a. N) t, W4 N4 @9 M3 Y& ~
{
. _0 E& Z" j* M& T$ m- N2 V/* Start the clocks */( Z% A- T0 i. B
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
9 m. z0 C# q+ r- ]2 b% m/ H& zMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
( j5 M6 A2 H7 Y# VEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,1 j! n) R0 y* _0 }
EDMA3_TRIG_MODE_EVENT);
' R. e$ E e9 ?6 JEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 1 z$ K8 I' c9 W. O8 L
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */% j* N* c8 A* D- V
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);! l8 V* P& p0 T7 h6 T' T
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
$ t: v4 ? O. v+ t2 Lwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
. Z) P* {$ n" [8 X4 H. A; kMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
; I [1 _* F8 I3 hMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);8 u; q: S9 q' k6 N" R- l
}
( q; m g6 i5 O3 z4 w: b请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
0 w/ u. a1 q& M8 S* \7 @6 v+ T
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |