嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
$ {0 j& A2 i! V& K& sinput mcasp_ahclkx, S6 T& v! Q% o
input mcasp_aclkx,+ @3 w( P2 r: Y6 ^ N) u
input axr0,
8 I; M# n! U7 L o8 M- d- S5 i* E3 x! Y
' d2 M% l& [* @, S* Routput mcasp_afsr,3 T) S, k' n! b8 J5 p* t+ p) a7 t) F* `
output mcasp_ahclkr,
" w9 E. V0 @8 q- B3 ]* Aoutput mcasp_aclkr,
K, q0 {# q- v% b9 xoutput axr1,& o- U% ^9 A: c) C) W
assign mcasp_afsr = mcasp_afsx;4 G8 L1 {6 k# T% {+ Z8 C/ v
assign mcasp_aclkr = mcasp_aclkx;5 F! R% i; X0 G6 o2 O6 ?$ W
assign mcasp_ahclkr = mcasp_ahclkx;
: F. m+ g1 W4 F: X* o% e6 C) e* tassign axr1 = axr0;
* c. z* E( `& r/ k
$ ]4 ^0 {$ o# \) ~8 j
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
; l( ` L4 m! }6 s" t
static void McASPI2SConfigure(void)
1 w9 o; q9 v" H! M7 \/ n7 ^{
+ V! ~) T6 i! a I/ c3 O9 LMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
$ u- y8 {" p% v4 l5 pMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
1 @4 i9 e4 j, ?) Q) k( F8 U4 BMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
: f U9 v, W; V, Y. L" K4 O( J+ WMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
' W1 q7 u: ^# b) RMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,# ?. |/ e; m& ^: I% m
MCASP_RX_MODE_DMA);
) z, C* L6 x5 E! G* e- {McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) G8 Y% ?7 w) `, A
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
- I+ S( A- L" {7 ~2 x6 V! k. ^6 zMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
& x3 ~. q3 G! Z9 l! R! r5 F# ]MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
4 ~/ c6 f" O2 N1 {" [7 oMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
9 T) t% e6 Y8 ?& b) J9 KMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
2 Q5 H% N. M% e5 H; v* J5 i8 JMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
( t4 O4 j. h, a8 u4 W( D8 }1 AMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
' _3 h, ]% a4 k& L7 EMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,# [! D# O* K& {2 \
0x00, 0xFF);
/* configure the clock for transmitter */
1 e7 `' C* d8 V( u# C5 k' M4 o9 ^! qMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);& b% C, {1 O- W8 W3 ^/ ^4 \
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); / |" D1 j3 E( C+ H! d" X# g0 g9 i
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
+ {. w; k) Y( k0x00, 0xFF);
$ z7 F+ _) n, L2 u9 |1 W$ |4 q( o% h- x, ?2 }! c
/* Enable synchronization of RX and TX sections */
# Z4 g$ }, e* Z' D AMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
% A3 |' `) p$ m* H$ _McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);7 _8 x9 A( w: q% j
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
- }4 E' M' j4 j4 M+ l** Set the serializers, Currently only one serializer is set as
0 X! W5 ?. B) _2 _( l% i+ w2 X' B** transmitter and one serializer as receiver.( P5 x4 u8 m9 ~- D Y5 K
*/7 R- W' x9 ]6 ?8 Y! L
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
9 W# t5 H3 m0 N+ n$ H& tMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*, P! }4 N/ r( L1 }9 V$ m. S) s
** Configure the McASP pins ! r: o$ J# [( i4 `* U: h
** Input - Frame Sync, Clock and Serializer Rx
. f5 {$ A4 s; J) u** Output - Serializer Tx is connected to the input of the codec
& I' G, G9 W7 q*/4 T: X% O9 ^$ I
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);, C- b# f0 Q6 g. u
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));( k7 k% q+ L. J1 c+ a, }+ i
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
% R* X# o+ D* E+ [" t+ |" j9 h| MCASP_PIN_ACLKX
3 d# k. h0 r& \, m: p+ T! J+ \| MCASP_PIN_AHCLKX" A; y$ P# I6 E; E/ v
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
% Q: k) K8 w9 h5 ]" OMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
4 L& \ E: p5 V. g O| MCASP_TX_CLKFAIL 8 `: ^6 n: [# `
| MCASP_TX_SYNCERROR4 R6 P+ l" q6 Y
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
* E' b# \" k8 W- b1 m; F/ u| MCASP_RX_CLKFAIL+ w3 {9 T, \7 O# x/ B
| MCASP_RX_SYNCERROR ) W: G# g8 B# }$ Y$ h/ \; H- C; S) Q
| MCASP_RX_OVERRUN);
( r" O, c9 `4 D8 L+ ]* X% n}
static void I2SDataTxRxActivate(void)
, m$ q4 V {- o- K$ T# W" A{0 R/ J( {" k8 K8 U0 B
/* Start the clocks */
" A2 B% X6 ?$ O3 d3 G+ r! X9 L0 WMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
+ j j8 |) X, kMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer *// O+ D0 q O- I# x7 x$ X" E+ Y# P! @
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,% R; S# b2 _4 O, m7 J: n7 e; X
EDMA3_TRIG_MODE_EVENT);, c& o! F9 z3 G5 A" {2 ]* X2 ^
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, $ H0 `+ {+ V l/ X+ q( |; \) C
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */6 s W+ T* |. R& y* H9 v1 |
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);) l9 i+ }8 n% `& _. e" i
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
4 n$ C7 C5 ]! s# {# Zwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
+ B, ]% U" h* u3 P/ o. B# }+ G0 `2 WMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
' s/ I0 o8 J6 D4 d9 o$ t4 yMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
' J8 M; e$ y5 w. M8 q}
p/ z8 {. T( Y0 C* P- j4 ?
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
5 U1 |0 f0 i! R
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |