嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,6 J* q( m8 S4 z& T, d& s7 Q
input mcasp_ahclkx,
. n. W- W; ]" Sinput mcasp_aclkx,) p6 O3 T- h1 z5 n. d; R
input axr0,
( t" d' w, u& c5 t }
& H8 r- v- v' [output mcasp_afsr,
6 H" t7 E( o4 l1 J7 [8 Goutput mcasp_ahclkr,
P, M" }9 t( V( O! O4 `5 \* C. goutput mcasp_aclkr,3 v6 ?( R9 @* V- {% Z# e! x* \3 l
output axr1," h$ `0 \8 A5 M- I/ N) h
assign mcasp_afsr = mcasp_afsx;' ^1 N7 r" ?8 ^1 C# W- ?
assign mcasp_aclkr = mcasp_aclkx;
7 ?8 e3 b0 C f* }- M1 \% Iassign mcasp_ahclkr = mcasp_ahclkx;
6 `7 }8 N7 E# ?: gassign axr1 = axr0;
; Q) z! ?: Q* z
, K! N2 f" C, c( N
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
& v* K. H( A3 \static void McASPI2SConfigure(void)* @" M! l# T$ {1 A$ P& t3 d2 ^% g- D
{
, b/ C. n6 B" @9 b6 F nMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
3 a2 C8 _7 {& }" C9 L( HMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */+ i2 m' e; g! I7 S3 Z* T1 i
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
; `1 G5 X8 } `4 V% BMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
1 E- [7 K: B) { OMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
' M" E* }1 H4 z* } Y/ gMCASP_RX_MODE_DMA);
" a' [3 J, B) BMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 m% ~/ D; M# k6 M; gMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
( J: c- q6 x5 @/ ~/ C; Z/ aMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
. f" C; k: `; A {6 Z) U) SMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
$ {# X, f- Q$ Q3 `McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, " |: M- l$ `1 U2 D
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
0 E8 w& f$ O8 C3 a, v o' u WMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);9 k( m) x6 E5 a5 y
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
% s Z1 H0 G3 y9 I6 T5 T, nMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
& S/ m( `& U* i C' q! C6 F, O1 o$ G0x00, 0xFF);
/* configure the clock for transmitter */
) p8 Y; J; { c* m4 xMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);2 d3 P3 G* p4 N- \
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ) ^ V; t# z! M4 O- v( m
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32, K, K+ u) V) ?
0x00, 0xFF);+ e: T1 p$ c% ]- F( S
5 M. y2 s0 r" ]5 T4 b/* Enable synchronization of RX and TX sections */ * Z8 t# d% G$ }- U1 ^# t
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */1 M1 i Y3 j1 s' P, ?
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
: _2 W& Q7 W& G' H$ X2 J1 pMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*$ ?" b; r. R& ] l) I9 u2 V. C. c
** Set the serializers, Currently only one serializer is set as% \% }+ N! y! E9 w6 ?5 D$ Q. ]' A" Q
** transmitter and one serializer as receiver., Z& [3 d, O* `- N
*/+ C7 O* e/ j1 p, [8 D' w" I# u
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
2 }1 n; T! n/ B1 n' j, `5 ]McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/* g" q! x, i( P8 i P
** Configure the McASP pins ( h6 I# U- L; e4 _2 W
** Input - Frame Sync, Clock and Serializer Rx/ m9 n% @' U A6 G! P1 ]6 e' l
** Output - Serializer Tx is connected to the input of the codec + b* u# \3 ]" c
*/, W, j1 ?+ ~7 @: x) ^: }7 T" k, H: @
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
" y( y& u0 s! d* fMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));4 b; ?1 D3 N0 W- o% p/ P; k
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX- [+ \2 z1 r1 R: |
| MCASP_PIN_ACLKX* g W3 d3 n0 w5 T9 t0 Y+ D
| MCASP_PIN_AHCLKX+ @7 \. {1 C! U3 Y1 d
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */' A# O# h5 q9 A% b9 a+ {+ J, B
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR \* F6 z9 t7 U: y; s
| MCASP_TX_CLKFAIL
- d1 S( w9 I, T6 _| MCASP_TX_SYNCERROR
" y5 E. F x7 r4 M; W z1 ^| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
! C7 b/ ?6 m/ k6 p l$ q| MCASP_RX_CLKFAIL
$ e. D7 j- k5 S$ C7 k! n5 V, v9 A| MCASP_RX_SYNCERROR
' h. o0 l; [# E! E2 J| MCASP_RX_OVERRUN);
/ R9 u8 T3 y' y; Q' r; `9 C}
static void I2SDataTxRxActivate(void)! H( L `6 i/ S0 @2 w, ~
{
5 L2 Z2 @4 ? w* Y/ _6 d/* Start the clocks */8 c8 R6 e' b; f& T# L* r% T0 V
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);7 y0 J5 s4 e. n; |2 z
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */! z2 I9 l% l- @* c$ }
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
4 ^1 C* M( M, eEDMA3_TRIG_MODE_EVENT);2 F, H4 B5 a, m. J4 ]* a6 M
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 2 c" r; x3 K( K* k% _
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers *// ^: ]- M1 x6 `. o4 \
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);/ H/ x! L3 p9 w+ G
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
. F: H0 n w. N/ n2 lwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
6 o, P8 H' e9 P" f0 CMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);9 k' J5 j/ U8 F7 j" \9 B0 G
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);% O/ m2 L! v A! {
}
6 o$ q1 y: k' n2 z4 a6 L9 y请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
7 ~6 b. R2 O- e" O% T. @% w# X9 D
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |