嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,, s2 k/ h. S- Y( P
input mcasp_ahclkx,
1 q3 b$ d* O& T" B: D) Ainput mcasp_aclkx,: N( |7 X3 ~+ f- D- C
input axr0,) a8 o/ W" o. A6 s b `
! Y# [2 J. n2 ?8 {0 R
output mcasp_afsr,6 M) Z% H% R; X
output mcasp_ahclkr,
# J& E" ?: m# N5 s {1 \4 ]output mcasp_aclkr,! {" n* Y' t7 l- Z
output axr1,) P8 q7 K4 t6 p: y7 V
assign mcasp_afsr = mcasp_afsx;& h+ t8 R, b0 N0 f ]& ?+ o" D8 `
assign mcasp_aclkr = mcasp_aclkx;, M( k1 {" i5 M# R
assign mcasp_ahclkr = mcasp_ahclkx;' H* J+ \6 b) {: k/ P C, c! T
assign axr1 = axr0;
& I3 s3 l+ o8 V( G
' L$ I$ f: K% O% ~$ e j在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
0 h8 M+ r8 e, @' astatic void McASPI2SConfigure(void): C2 @! c& ~) d! v" O+ n
{6 [: g- Y+ K: Z2 n0 e1 E; T* s
McASPRxReset(SOC_MCASP_0_CTRL_REGS);6 i9 {5 u' x' U# g6 I0 c$ t7 i
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
8 S9 j, _/ x5 O' V# rMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);8 c2 d7 x( z# R' s g8 y. A3 P7 e' o
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
- O. d) ]# _1 g# ]; PMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 q; [9 J7 o, [7 [4 {% ]MCASP_RX_MODE_DMA);
6 n3 K! j0 N' X: RMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 P) ~9 _) }$ IMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */, m; n2 n# ` o4 B8 Z9 D
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, - A5 a/ C! O0 V4 `' d
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
' U1 X' |0 ^: D, X" l1 U9 l4 K' oMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, " \! Y3 a2 H, ?
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
x9 o7 {9 ?; c- v, L$ U1 e$ i! hMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);. i7 U& |+ K2 n( B) z N0 J
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 4 @ l; a( ?5 [4 M
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,/ F6 {9 X9 K, w* {
0x00, 0xFF);
/* configure the clock for transmitter */
0 n1 m3 C) ]3 ]# P: d0 F: QMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
9 \, y3 q4 L" o" I+ \McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); : M) N& Q& V2 e1 h5 \+ _
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,8 `! j( | W8 g" j# }, M' L4 n
0x00, 0xFF);1 N8 w* L: l$ S( X6 ?, v% B, p$ \
& d0 l- K3 J/ _ n
/* Enable synchronization of RX and TX sections */
3 [2 d5 D U9 Z: x' F4 jMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
9 N8 p3 v" _; o# }. iMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);* a5 b1 j' `1 D: y, E
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*6 E* ^4 E4 f! e
** Set the serializers, Currently only one serializer is set as
1 M0 I5 I- g j8 ~9 e** transmitter and one serializer as receiver.' P# W& y& E: ]# D m
*/4 Y F: _; V8 l0 P9 w7 q
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);4 X0 W* y( K; x4 [
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/* g- n- b. i! \7 A0 y
** Configure the McASP pins
# }! V$ }2 T! m' m' o7 w** Input - Frame Sync, Clock and Serializer Rx0 \# F) `1 R, }8 @
** Output - Serializer Tx is connected to the input of the codec : E' I" {' L4 X5 G/ B4 G, P/ R
*/6 `/ D* T% x' s' T
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);/ P7 q1 B) R" Q# Q
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
9 `. b* w ~# l6 XMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX+ f U0 R8 l- T- u1 G/ ^
| MCASP_PIN_ACLKX
4 o- W% |* G) t1 f% ]2 C| MCASP_PIN_AHCLKX) _! C# k% f) m9 }( t$ {
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
: x2 i. V" a& lMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
, q& E/ E' U. W9 f4 s5 I| MCASP_TX_CLKFAIL & ]5 S4 U& G/ o/ P- e
| MCASP_TX_SYNCERROR
M2 i) @9 G/ H| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
, ?" J0 {1 L' j% l" A$ X y: K| MCASP_RX_CLKFAIL
+ _3 u7 B+ F( o% `/ o5 Z. u9 A| MCASP_RX_SYNCERROR ) K" R# S$ W' b
| MCASP_RX_OVERRUN);
: L# S' K3 _ d}
static void I2SDataTxRxActivate(void); J( f B6 o- q9 w2 z
{% K( M# O4 |& Z+ {$ [& H* A
/* Start the clocks */3 x0 E8 |5 P- D+ _5 Y! o$ y
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
/ `- w [/ w K- |, PMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */" l% h1 u6 X; V n) l# b1 i; Q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
1 H; C) v) I, _2 s. H, mEDMA3_TRIG_MODE_EVENT);
! U/ ?9 b+ s8 V" [5 B$ iEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
3 g1 w9 O$ b* O! o5 Y& Z6 E. ?EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */4 r! Q, ]6 h: o# [1 I3 I( T
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
. g1 t( s4 S5 }( S, Q: F! mMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */$ z$ b8 e9 n, S4 H
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
) e, |$ `( h, k6 z% b/ y4 ?+ DMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
. b& Z2 `, \: j+ ]McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
% Z+ b% ]1 b* w& { k}
3 ^7 p) }& R# x4 X V+ E
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
& j8 C8 C \9 E x
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |