嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,9 B; Z1 C8 w" R* m) \* Y
input mcasp_ahclkx,
1 x q! F, a4 m$ U9 X0 L* h& B, Rinput mcasp_aclkx,3 g( d; }2 L. ]; N
input axr0,; Y' W- w% b h) D1 S7 ~
# W& c# p7 f' @+ G7 G
output mcasp_afsr,! s) ?$ `5 x' |4 @) h* F$ w- n
output mcasp_ahclkr,
) n# O9 i, ]. B" | boutput mcasp_aclkr,
\% U* _ G9 U/ ?: H" X# Ioutput axr1, |) \" `0 w2 g) p% \8 A, M5 V
assign mcasp_afsr = mcasp_afsx;
! I7 J+ {, t4 J& \/ K* Massign mcasp_aclkr = mcasp_aclkx;
. R' c* R8 ?; W# `+ z& c$ u- z1 P0 x9 N7 `assign mcasp_ahclkr = mcasp_ahclkx;
0 k* H, Y& {' N' K |3 | K# Massign axr1 = axr0;
) D: ?: y* T& [4 {! n
5 N, l g2 i, [( A
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
& U8 l: ]: j6 C9 o) H, j9 U
static void McASPI2SConfigure(void)
; k* f0 o, z) L1 f: c m* l0 j2 k{2 h3 k3 h9 g2 q/ R, L
McASPRxReset(SOC_MCASP_0_CTRL_REGS);7 g$ c3 |; G. m6 p6 A3 e; X1 }
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
: T& d1 c$ x: Z- W PMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);+ N, b4 C5 _7 [" o) {% [/ D6 p6 X' ~
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */8 P5 G4 W! [ t9 I# U
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# L7 u/ ~" Z) d$ DMCASP_RX_MODE_DMA);/ |6 I" T- f3 K& }" S$ H
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* I. Q$ d% O' @/ [" j: KMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */+ D, c+ |3 ?0 X. K9 e) O0 @' M
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 3 X) \4 ~, I: i8 m# v$ @* P& M
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);" N) F0 c' j9 r R4 t$ }$ ^
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
; |/ {3 `4 y+ D5 ~MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */5 y9 w2 e/ L/ t, _: P
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);5 u$ E7 y2 I- {, u/ H9 Q" W0 i
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
K% x. R4 n5 K- i* lMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,: R' F. K$ a7 i! P+ [- ` s' S
0x00, 0xFF);
/* configure the clock for transmitter */
* W7 c$ h2 d4 m$ v" aMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
9 G0 Y5 N! m5 ~8 n$ k- Z- R% oMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
: u3 i. s5 w( K" Y, eMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
4 I8 ~) j7 b9 m0x00, 0xFF);; Q& w( f1 L. f% {3 I4 |
( ?7 L! l+ E+ I R8 o1 P- _
/* Enable synchronization of RX and TX sections */
, u4 t" k# I( x( m6 w4 f/ ^3 JMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */! ]6 K% M2 W t- K
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);# N, F( j1 O' E9 \9 a$ s4 {/ s9 x
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*( N6 ^: F; r! f0 F( C' j! H
** Set the serializers, Currently only one serializer is set as' G+ r) l9 z1 ]0 |3 h7 K# n: p0 K t
** transmitter and one serializer as receiver.2 r3 |0 r0 e- s ]
*/
+ T ^8 X/ r2 N' o7 y- G& i* b j/ SMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);5 N- T, ` \) D
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*# a' P" }2 h# |
** Configure the McASP pins
: y. d4 F: x( {! x* N- Q, H** Input - Frame Sync, Clock and Serializer Rx
' O4 F3 A5 j( d+ s8 K* @** Output - Serializer Tx is connected to the input of the codec
9 Z, D: i% f1 r! P! ]) x*/
* j. x8 [$ E3 e$ J2 z# bMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
2 Y" W3 T6 j( |& e7 hMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));9 X5 m2 G9 B0 `" p
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
' V6 z( W# Q& G- i* _1 a* v& W| MCASP_PIN_ACLKX. m% l$ W- a8 k+ d
| MCASP_PIN_AHCLKX
* |) p7 H4 y' p3 W| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
, i1 s, d8 f" o2 L x' L; HMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 7 v9 t5 O6 {' F
| MCASP_TX_CLKFAIL
2 E [: Q' n: [% }' k9 I4 @- B" g# N5 ?| MCASP_TX_SYNCERROR$ P: [9 e2 _; r3 ?
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
, Q% V% E5 d$ I$ i" ]. N| MCASP_RX_CLKFAIL
, X6 S- m( @* K+ D$ v7 Q| MCASP_RX_SYNCERROR 0 @$ H8 R$ P$ ~5 [. K& {* B5 L; v
| MCASP_RX_OVERRUN);
: I( t& {+ [: a}
static void I2SDataTxRxActivate(void)& r- c, v4 B+ W* j2 Y3 H9 r9 e
{
% U2 k6 k! D, y/* Start the clocks */8 F# J8 M h: Q
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);7 u: P$ q2 J; X+ \7 `
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */. s6 q- b) P l& p
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,- c$ G( A9 B0 Y {# }
EDMA3_TRIG_MODE_EVENT);
; x6 z8 z# U7 GEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 9 Y& |. R4 t! E. K( ]4 {
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */. K$ W4 J9 S% |2 K- L; ?
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
9 ?7 J4 \: u# n7 {, N$ k* QMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */. X9 n' i$ u$ @6 S. g$ D5 q
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
; _9 S2 c, f( X v3 z- D. B$ M! YMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);4 t+ M$ R2 R7 ?$ q
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);$ N9 K+ F& Y) h& G
}
/ v8 `' _+ U! c. | N h8 r
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
$ n/ I7 `8 h3 H. G8 I
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |