嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,4 F% X# s5 e5 c( X
input mcasp_ahclkx,
7 t% G2 l4 \- w# T2 c( n# cinput mcasp_aclkx,
5 y7 P- M- ^8 i, L4 Ninput axr0,0 c& \- P! Z/ d( \" G' w/ r
+ Z# @/ m; J5 d' S* toutput mcasp_afsr,
* ?2 O1 Z2 o) h5 t( f0 m' z4 m; G8 Noutput mcasp_ahclkr,
) i/ {" V% S) b% k( N1 ?output mcasp_aclkr,
7 C2 [/ F$ @7 P5 q) s/ Q1 woutput axr1,# r; v& X6 i, }, g, v4 Z5 r
assign mcasp_afsr = mcasp_afsx;: v/ S* h) m, }; \2 `0 K" _
assign mcasp_aclkr = mcasp_aclkx;
: M) M' t0 b C, ~; w7 Hassign mcasp_ahclkr = mcasp_ahclkx;
6 m+ F6 U+ J# ?* P9 x9 o& uassign axr1 = axr0;
- C0 L- y/ u/ J+ e) Y1 n1 v4 y
2 U9 ^1 D$ Y, D9 w在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
' E- H5 s# s! ~, p. _* hstatic void McASPI2SConfigure(void)
5 v2 g4 {/ _6 @: V{0 q, i3 r, p, R {9 Q6 s
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
8 B; \- e5 g& d; M' h* AMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
/ N% C( j" R% C0 F$ s# V; z$ IMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);# t$ {4 f% q, e i% y! X+ M5 Q
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
6 T* s0 d. D. y8 r& @7 ZMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 C* j5 D K% h4 AMCASP_RX_MODE_DMA);
8 m9 D; G0 p; p9 ~* RMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 R2 o5 m, n* s) r- t! b( h9 f9 jMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */( p8 E. L/ T9 t$ c% s* n0 z3 _0 p5 y
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
7 F* R) A- j' ]" \* {+ y$ PMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);5 o- C9 e3 N8 V* @* E5 X
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 0 p" E% c1 H2 I1 G; o4 [/ G/ |
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
$ `5 ?% e# Y! XMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
2 K6 Y2 {# T `6 O1 JMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
( [5 z7 }8 b+ J5 p- T0 P" w" E, sMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,$ Q+ t- |6 F8 q5 x4 n
0x00, 0xFF);
/* configure the clock for transmitter */" P2 Y& R5 r2 s- d! [
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);, H' A+ c8 M$ Z* G5 P6 A6 r
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 4 t+ }/ R3 D. ]7 ?
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
" M; V! p2 N, _4 |5 [+ F6 x5 s* L0x00, 0xFF);
& j d/ K5 c1 K; M! b3 I. T. B2 r- t0 j$ f
/* Enable synchronization of RX and TX sections */ . h& Y* d# U; E9 `$ ~! S
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */7 ~: ~6 j) g* i$ ^1 _. S( W) y
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);& \1 r" |* C. F: _- f; b
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*6 g/ H* N* u7 t' h9 M* g
** Set the serializers, Currently only one serializer is set as
2 ] ?# E5 P, m** transmitter and one serializer as receiver.
, C! r, S" }0 w*/& [! f9 A4 W6 m3 |5 p2 m: i" Y; a
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);- k. G# t4 K. ], M
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
2 r V' T* u. P4 z: ~( E1 r. o5 N** Configure the McASP pins ! \4 P' S+ B; {' M
** Input - Frame Sync, Clock and Serializer Rx
& Y6 U5 A) k! [2 b* j** Output - Serializer Tx is connected to the input of the codec " K% |8 {5 k. n
*/
1 \/ J* n, t) @2 ~, J, `! X! wMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
6 j* m1 D1 b! F4 rMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));- n0 \/ R, W& @7 _& w. I
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
8 G: `* l) K: Y' c' w| MCASP_PIN_ACLKX9 p& c) I/ z, g: T
| MCASP_PIN_AHCLKX
6 {# J0 C' M0 z( v| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
2 E% ?6 d( u7 d) gMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 0 u7 \0 f7 J8 f: N5 z7 V7 C
| MCASP_TX_CLKFAIL
& O8 ^8 f- N$ _. u0 @) k% E6 I* C| MCASP_TX_SYNCERROR
: ?& E. \- |) ^$ R; y2 b; c| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
/ ~; F, Z% c! e' W7 E6 ?1 y| MCASP_RX_CLKFAIL
( F) U, U7 g- D| MCASP_RX_SYNCERROR " u2 W- D% ^4 p/ [4 R
| MCASP_RX_OVERRUN);
: |5 ~# k( W: M}
static void I2SDataTxRxActivate(void)' i% ~2 i! G0 g- P- y" d
{8 E [4 @( g1 m; h
/* Start the clocks */
9 E' W& ^- E: H3 gMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
: U4 e/ ?1 a( bMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
( d E' @5 O `% w- XEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,7 Z' l. B7 G" K! }1 {) X/ D
EDMA3_TRIG_MODE_EVENT);2 }) b9 g7 d: F1 ^+ D; E+ F
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 2 @% s% X X. z" d* v
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
4 w$ C/ A! B/ l( o& C/ K, DMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);/ ^" r ?/ i! [0 B$ i; r5 @& z
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
! n z' E/ W z iwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
. {% s4 [& I4 e$ b! }, RMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
5 C* G9 x* ?5 {2 o, P; g! |McASPTxEnable(SOC_MCASP_0_CTRL_REGS);- g, G1 U) N7 V- K' U
}
" A, o* S8 ~% c' ~) U请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
# ~- y5 h8 k1 ]/ A7 T
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |