嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,$ |9 m5 w% v# M; P
input mcasp_ahclkx,4 F8 z: n0 T* U8 |/ W
input mcasp_aclkx,! q7 ^5 I9 _, [& ?$ \
input axr0,0 N- T7 ~: t. U$ y6 }) Y
0 k5 B# d8 F: n/ P
output mcasp_afsr,
5 k! w* s: K2 K$ d1 Ooutput mcasp_ahclkr,
J9 S9 ]. \+ loutput mcasp_aclkr,* X% j3 E3 S7 y% Q
output axr1,+ l! l2 r0 ]( u5 a$ ~
assign mcasp_afsr = mcasp_afsx;
: o1 T' D' s9 Z% Jassign mcasp_aclkr = mcasp_aclkx;
& f* n2 X5 v; | ]# kassign mcasp_ahclkr = mcasp_ahclkx;: T4 o u# F! I; _
assign axr1 = axr0;
0 T: r. [! Y0 c U+ p
* D) w$ h& F$ Z, a在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
. u% l7 T3 J. f6 P: g) e
static void McASPI2SConfigure(void) p" b6 O4 v" J& x( E
{( z( ~; I6 d, |1 N1 D4 k+ i4 `9 H; G; ?
McASPRxReset(SOC_MCASP_0_CTRL_REGS);7 Z+ \* [8 f1 B3 ~' q
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */, T4 `7 ^! D9 i7 g1 U8 Y4 F
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);5 `' c2 Z% l) F- r6 m8 w
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
4 v/ I1 }! b/ @+ ]" K; rMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE," i$ |; D* z4 y
MCASP_RX_MODE_DMA);
4 E2 C$ H# o3 @7 s+ h/ q3 gMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) ^' F( G Z e0 m4 RMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */: U$ @! o( b. }, w
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
F5 q. v8 n J5 x7 KMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);! c1 ` A" p7 j$ r" {
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
* O8 F1 I" s7 x! ~& K# ]5 Z! ~MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */; Y' ^6 ], m& w5 T* ^; ~
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);) {1 E9 ~' G! z G
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 3 N( g* O+ t {6 m" M
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,* B8 c* g- s: R, P; V
0x00, 0xFF);
/* configure the clock for transmitter */
% F% W( z; j2 f2 g% x; bMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);' ?7 w6 E& l% T; V9 m* D, q7 j. G
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 6 h; h& A4 n+ y9 |
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,/ j' t4 h2 Y; h- q9 Q1 `. U
0x00, 0xFF);" B8 b: [ X l7 A) I
! _/ p. S% K; H) [
/* Enable synchronization of RX and TX sections */
3 o; M* C/ Z4 Y D' O) t' hMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */: j! m, U2 s5 l
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);: {1 j* t6 l8 l# W! e
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*' D# a% K" E- h% Z e+ a
** Set the serializers, Currently only one serializer is set as
* z1 I! ?1 r. ^; l$ L! h9 K2 F** transmitter and one serializer as receiver.; p1 e2 B, Q' P* H" W
*/2 i, {) E2 X1 m+ S
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
+ Q! O3 c* Q5 {" b- ZMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*7 C& b5 G: l' p2 I6 \7 Y# M
** Configure the McASP pins
4 s- d$ F; X; Q, ] P: u** Input - Frame Sync, Clock and Serializer Rx8 T4 I- j/ |7 [& ~0 K% D# k
** Output - Serializer Tx is connected to the input of the codec
: W% ]/ ~; _$ O- F; n" j5 H*/+ ~9 M2 B# _: _) R& q. V
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
- u9 p; r5 ]% p! jMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
; L* j) I: G4 g8 e& q) G) v/ }2 fMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
: I2 o, w, ~0 || MCASP_PIN_ACLKX1 @# u( O/ H* V( Q
| MCASP_PIN_AHCLKX* r _# I6 m. \. {$ w5 W% u! C8 s
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */2 p; F3 o" k6 s1 y# \7 Y
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
3 \. _7 j6 y! {& t| MCASP_TX_CLKFAIL # w% R, w9 N: D
| MCASP_TX_SYNCERROR; w4 t; ~0 _6 c# Z* f, F, N
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
! i* `0 t3 x4 L3 N/ p6 I| MCASP_RX_CLKFAIL
3 s ?! d, ?! G( z f% s| MCASP_RX_SYNCERROR % |4 y8 M$ Z c; v8 _
| MCASP_RX_OVERRUN);
+ H& c$ o6 g* h* p" k}
static void I2SDataTxRxActivate(void); h% h0 Q$ U" q5 P0 g, Y+ C
{( z$ f, A* S9 X
/* Start the clocks */
% |. z& \: D( H& zMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
+ B6 E+ K I$ B) S7 o# x; c2 UMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */; j/ P: N9 k9 z/ D. I5 V5 o# u+ B
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,8 Z: F8 ~5 _6 I7 |
EDMA3_TRIG_MODE_EVENT);' _/ p* B0 W e7 Z( H' U, z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, % q' K( B; F) Q0 h7 r
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */; H) B+ C/ |5 V' X! @/ S$ s
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);8 f: ^% q0 m4 s
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */9 @% k. u9 n5 U N# c
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
) _8 h9 ~9 Q* n* @; W5 GMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
, c% k: K' F; X c1 x3 {$ AMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);5 o3 ]( y) x B4 {
}
n6 e# y0 k4 t请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
) d4 I4 k/ B2 \
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |