嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,8 w) x3 G/ @; h$ k% |
input mcasp_ahclkx,7 |7 S/ X8 k: a, H' F
input mcasp_aclkx,
! v8 j' n$ f. K0 G& y4 c: Ainput axr0,: G- d" w8 h8 O4 _& Y7 s- B
$ v9 y9 P; {/ Joutput mcasp_afsr,
# j$ n% X2 u1 `2 n' w0 V, Noutput mcasp_ahclkr, b5 {" H6 e* y! m2 F! b+ i! D
output mcasp_aclkr,
4 ^- ^7 F' m- ioutput axr1,0 F! I) M+ k5 ?" E2 x+ o
assign mcasp_afsr = mcasp_afsx;+ Y1 z: w4 t; S/ I
assign mcasp_aclkr = mcasp_aclkx;8 A: d) e4 [: Y/ y4 d( {- P8 N
assign mcasp_ahclkr = mcasp_ahclkx;& v" F) y. X" E, Z# |1 L
assign axr1 = axr0;
" G% k* t0 F. `7 j6 A; l( a6 D0 N5 W( q- p! b
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
8 ?2 G) T% i' Lstatic void McASPI2SConfigure(void)
6 {; V% P+ V+ B: u; t{
) N/ a( ?3 w1 [' J8 m" U: YMcASPRxReset(SOC_MCASP_0_CTRL_REGS);; T: W M7 V2 S* t G, w) B
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
5 X" M! H5 s* x- ~2 mMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
+ ]2 h; G6 l8 w* ?* C3 t5 q3 QMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
" @, Y _0 q ]4 b0 EMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 ` |; V- V# v+ I4 L
MCASP_RX_MODE_DMA);
- K2 N8 \2 I! z) c; o' kMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 [! I e1 K+ m* Y- d' I3 y0 \: @
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */5 b" v' r& v9 r# m: C l) S
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, / ?8 R" w% {* n& ~& C- q' A
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
2 B" y0 G- {$ D* mMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, . u! Q1 T [% Z9 ]1 g* @
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */6 I5 D3 @& t! G+ B8 g! k
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);3 Q) Y) I3 P* x- N% I2 Z# W) u9 \! J
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
& }5 }/ |% K4 M$ YMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,8 Q. `' e. E- e
0x00, 0xFF);
/* configure the clock for transmitter */: k. h0 x) c6 O8 n% {
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);' \, P& a( e: k
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); - {0 ], c5 c% [. k% V
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
, G* |; c9 M0 N# B0x00, 0xFF);! R% N" U7 d6 ^0 M
0 ~% C5 h3 ?$ J/* Enable synchronization of RX and TX sections */
* Q1 r2 s# Z' R% SMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */! U2 p/ \( c5 t) U1 |4 g. |
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);0 e5 v% E& y0 K% ~/ x
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
: {+ Q6 d* Q' @, n0 s+ U2 O! d** Set the serializers, Currently only one serializer is set as
. a- d* h2 z9 W+ d: M' T** transmitter and one serializer as receiver.7 `; y! y/ J' G) s
*/
% c$ s* Q7 h, @McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
4 D/ T& z( i: [! Q; v" M0 Q) |( H# BMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
, G A9 q4 d$ Z4 u6 K" c** Configure the McASP pins & t$ M7 Z7 u4 w
** Input - Frame Sync, Clock and Serializer Rx i/ K1 s U y3 `
** Output - Serializer Tx is connected to the input of the codec
5 J7 L8 g. V2 p. W*// i2 ` h5 `9 ]' {: [) b
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);$ O4 _* m7 x1 u$ q, K: R5 q7 {
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));. D6 R1 |0 ^9 \/ r
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
( O z# q5 f4 j' R || MCASP_PIN_ACLKX
- k+ d2 L$ N8 ?1 Z7 t1 P| MCASP_PIN_AHCLKX
* G) }& y3 x8 Z c$ `; V9 T| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
, {9 t( u) v; d! Y# w0 d; BMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
" m9 Y- r# R1 u! }! u| MCASP_TX_CLKFAIL " Q) M- D' J- X
| MCASP_TX_SYNCERROR8 ]; u( K/ W1 Y: E6 G3 Z
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ( k! ?7 e* e. [- @. Q
| MCASP_RX_CLKFAIL
i6 |, p4 s0 C+ h| MCASP_RX_SYNCERROR
4 d. j5 @* O4 \1 k| MCASP_RX_OVERRUN);
4 c% T) I7 P% c9 {7 g4 K: z}
static void I2SDataTxRxActivate(void)' R& }& Q3 I A7 L& `0 J5 O. A
{
@1 N- l* ?' J/ u1 {/* Start the clocks */
, o A& d# `* l( x5 Y* r8 L9 eMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
3 c9 X, q1 A) F6 W- z8 N% PMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
/ d5 K4 n. T) v) o, e/ A, }2 m' PEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,' T O n1 c# {8 K% M p+ Q! G$ m
EDMA3_TRIG_MODE_EVENT);# X' S0 U/ m) Z4 ?
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
) p! I' @% _6 q" U, lEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
- {& M# c g- C; f* @& _McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);( I0 o) ^5 _& r* `
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */! }0 {. E; T3 K- W7 B+ ?$ ` S
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */4 c' `7 R6 C; h1 @, T+ e
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
! _+ \5 t* I9 j/ }McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
2 b- ^, N* N: Z6 {/ V2 k' t' o}
3 z+ Q* B. H5 b; U. Q1 `请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
8 A1 j- ^* ]2 z
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |