嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,, w$ I! S9 F0 s0 X# |
input mcasp_ahclkx,
, p+ J7 `4 ^( l# K% |6 v: Winput mcasp_aclkx,
' }% a7 m" E, \. W: Uinput axr0,6 i1 k; }1 [) Q( ?
2 T. N: V: |5 P- D9 c
output mcasp_afsr,2 C1 C, @! M/ t, i
output mcasp_ahclkr,
5 ]% F$ P# x: \2 p0 e# Zoutput mcasp_aclkr,
" W- t% F& g; Poutput axr1,% k% e$ I1 { `" N
assign mcasp_afsr = mcasp_afsx;
, ^. b( V( B# I6 Iassign mcasp_aclkr = mcasp_aclkx;1 S0 k5 u" x2 s/ Z6 K) O, D) F7 n
assign mcasp_ahclkr = mcasp_ahclkx;% ~# A4 d4 g: O1 c/ x
assign axr1 = axr0;
8 z) P7 G7 E4 D7 d$ H- G6 t1 C( n4 v0 O0 N
. `2 T' N% c: k6 b* W+ c# M$ \在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
/ `4 q1 C- O A: F
static void McASPI2SConfigure(void)& |6 ^1 W* n+ X# Q) ]% i) _5 J2 e
{6 n K) p5 w3 y9 G
McASPRxReset(SOC_MCASP_0_CTRL_REGS);* I3 ~2 Z; w5 u" V+ }
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */+ r2 }+ C: P% g0 d
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);* o6 h' A4 h" Y$ s
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
/ t0 Y8 _6 E* W# `. @McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- N, s8 |! t5 f) Y
MCASP_RX_MODE_DMA);' C% o. @" E! g+ c! V( S
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, ]5 l4 U7 J$ L
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */; H4 I6 `7 l8 ^" ]$ G1 Q" Q* d6 y
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
) [6 u3 {& Q* \$ I! ?3 G/ tMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);! y) q( P2 H' l: d' Y) I
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, : H0 l3 k3 J9 d9 X7 c) o- K' d
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
{$ C2 B7 Z, ]! k. ~: WMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);) E3 {" j/ e1 M! m# ]
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
! M* F; |/ x& M6 {+ X9 J8 M9 _' Q* qMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
" k3 F9 Q5 V/ Y0x00, 0xFF);
/* configure the clock for transmitter */" W s7 Q+ F. d9 a
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);; n, a; j" j' d' j. x
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 1 v+ F* C& E" g! g, y( a; Q
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
5 f" H* ?4 W, w6 S0x00, 0xFF);
; b1 e. v/ k: a* ]' ~
1 |+ s: l3 ~' ?' |$ w; p( X# L/* Enable synchronization of RX and TX sections */
8 m0 C* P3 z& }! zMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */6 D) O( ?" r1 d+ q, K* n
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);. ^( T8 u2 T$ g1 d8 V
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*& {7 a- C' g5 J
** Set the serializers, Currently only one serializer is set as2 x( D( v7 i# _: H- B# L
** transmitter and one serializer as receiver.2 S2 n6 |: f3 t9 R
*/0 H% b4 r/ W; C4 e
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);/ S7 M3 G ^3 U; o! K" {
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*6 J X V5 l5 w/ H) i
** Configure the McASP pins ; t1 M% G- I' f. d4 b+ v% A1 K- L
** Input - Frame Sync, Clock and Serializer Rx2 C* N$ B3 t* z
** Output - Serializer Tx is connected to the input of the codec 8 D3 o, ]/ M7 u5 r+ k2 ^
*/" J; u/ J4 f6 c3 j! F- ], E
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
, F# u8 F+ c2 P9 P/ mMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));- {+ T% V* N" Q( p1 N( m
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX. w7 t8 F6 ]! K& p) K+ A0 \ ]4 A
| MCASP_PIN_ACLKX* k* }- e' h7 ?9 {$ k! _# ~
| MCASP_PIN_AHCLKX
% U; L* g! Y/ ?0 c# Q1 c| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
! y& t. `; @7 d* iMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 3 K6 K: q; q+ @* [( K0 c8 R& ^
| MCASP_TX_CLKFAIL : f3 E+ Q! H) ]' S* `
| MCASP_TX_SYNCERROR$ E6 A9 t8 \! x9 \, b
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
2 C- @0 u# M! B9 ?4 V" f| MCASP_RX_CLKFAIL6 K% T4 O' m. a! P. W4 ]
| MCASP_RX_SYNCERROR , z# U8 R! r1 \# M; [2 X( B
| MCASP_RX_OVERRUN);9 Q- L' D: w8 E o/ w9 B; c) @
}
static void I2SDataTxRxActivate(void): \( I0 }( f0 g' ?, h
{
! W# x$ \. V4 M! l/* Start the clocks */
2 R8 r, Q5 K* _2 y0 CMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);1 u& U5 u+ k! c# p5 c
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */6 ?) Z; V! D( P. q) ]
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,: ]! @" Z F% m4 A
EDMA3_TRIG_MODE_EVENT);
( u- ?2 X" s+ x, N EEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
& Y! } {2 p$ [7 y1 V) P% xEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */4 C6 X& p1 D" N0 r
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
$ X5 x3 z2 @( _8 x( BMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */0 C4 \/ K: s$ E7 I/ {, G8 d0 N* E
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */& F7 D7 w' F3 @- H
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
8 B& H# L3 m# N5 K, O2 |) RMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);7 e- V, \9 p6 B0 ?9 F
}
2 n6 N8 c! d4 n; a4 j1 m请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
: ?: Q5 ?/ X) z; n/ D
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |