嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
( H; _+ m0 }9 rinput mcasp_ahclkx,
1 j& I9 \/ J1 Ginput mcasp_aclkx,
7 D/ W1 D+ a7 v* \input axr0,
1 H9 g+ [4 c- X+ Y9 | S& j
: P3 y+ h: F+ P% E- ?output mcasp_afsr,
1 q$ t1 K7 i# t4 c2 \) Xoutput mcasp_ahclkr,
/ m9 O- U" I5 z% {8 \3 Loutput mcasp_aclkr,% G6 K# i1 h, b) [# J2 |& D/ X
output axr1,; x3 j; {. M* e+ h+ I, z
assign mcasp_afsr = mcasp_afsx;
/ e( U$ O4 W* Y7 H2 z# Gassign mcasp_aclkr = mcasp_aclkx;
2 ^7 K2 ~; g) J0 d, ]: zassign mcasp_ahclkr = mcasp_ahclkx;
6 S! m/ Y; k9 N! Oassign axr1 = axr0;
8 S0 L6 ^$ Z* b1 Y/ v2 v. L
7 |- R& I2 r" Q0 }) `- ]
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
9 @! D- x {) `* _0 V* ~2 P" M5 X9 y
static void McASPI2SConfigure(void)# k0 |# [7 v3 K+ o* q
{! l8 w3 f- A" m9 m. \
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
! x/ [8 L' s! G# N+ Y7 s3 t" J% yMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
" G' R, |3 s: B# P9 tMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
; H$ r7 Y5 H% i- C$ b* t( R+ xMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
; }# F6 v* @& ZMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,# L. F! B, D7 {) j
MCASP_RX_MODE_DMA);) r: c( L4 l7 p- L; q
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; f1 W# ? n7 Y/ f+ L4 K
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
* f9 c0 o1 t( n, wMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, * }2 @+ {" [0 S' n: h* p* b
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
( @# Q+ ]0 b7 wMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
4 v" s4 j( a' Z1 [3 t- wMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
. }7 d7 t% P2 C, g0 oMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
( \; w4 h+ b. c/ g% `McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
- ]: [9 W9 k+ i6 |: MMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
% O: m6 D- k" q4 j+ F6 b0x00, 0xFF);
/* configure the clock for transmitter */; O0 Z1 ~; M1 D8 n
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
! b! |& R3 Z ~# @% nMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 1 ~* ?0 r+ {4 W8 C" X1 p- e5 T
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,4 K B0 W9 ]; G' X4 w
0x00, 0xFF);, O6 ]# J1 l: j! o8 x9 I
1 j6 R7 U' n0 }* g
/* Enable synchronization of RX and TX sections */
& b; l H! k9 E9 {2 ~2 M, n) mMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */! G; W+ x: g! C! P
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
2 q( C) }6 m& oMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
5 d" N1 k6 Z7 c) N4 c** Set the serializers, Currently only one serializer is set as
; t* z1 ~: G& P) r+ M8 Y** transmitter and one serializer as receiver.$ _+ ~+ U, o3 Y" {) a$ E; x
*/- N' o5 D$ Y/ P: f- M) `/ L" c
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
) k4 z2 ^1 ^5 `' V! IMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
! U2 ~1 g6 n/ v% r% S; ]8 d. x** Configure the McASP pins / z- K$ \: o# Q0 Q, m7 r% P
** Input - Frame Sync, Clock and Serializer Rx* C0 B/ Q5 c- {( F9 `# w
** Output - Serializer Tx is connected to the input of the codec ]$ ^- e" e# O. j
*/
3 b! s, `- V) K8 |McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
* D2 o+ I, L. }9 q4 a' FMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
3 j+ S5 d ], {, k& ^, R2 q0 I* gMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX; C6 l3 {. o# T
| MCASP_PIN_ACLKX
' T0 I6 T& [# X) Y' z8 C. J6 m/ V| MCASP_PIN_AHCLKX
- s; U$ S! G( R. _, _/ t+ I| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
7 s9 w' y8 |/ l2 {2 u4 x+ ~McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ) o* E' K( h2 Q; S+ ~9 ~! b! O0 A
| MCASP_TX_CLKFAIL
% I& G: \9 Y4 ~8 E4 M| MCASP_TX_SYNCERROR7 m( s: ~* B6 ]8 \# J1 U
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ( g$ ~& b R" b: g, C
| MCASP_RX_CLKFAIL
5 v" h; F6 I7 B+ n# O' v| MCASP_RX_SYNCERROR : L, h# S. i3 {- `
| MCASP_RX_OVERRUN);. [ t Z) ^4 i* Q
}
static void I2SDataTxRxActivate(void) J- p8 d2 s! @! e
{
9 ~3 w# W6 [- W0 \8 {$ v/* Start the clocks */( e+ s( H3 p) O
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);) \4 x2 @' u/ Q v0 A2 s# U
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */8 ^0 N% R+ {! O0 ^) J0 A$ @5 M
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,, @! Y7 K: s4 K3 @3 C; s T' j
EDMA3_TRIG_MODE_EVENT);
- Z1 Z2 n) x9 UEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
) H: n. \9 u& KEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */; |8 _! ]1 A9 O5 e; `$ w3 E6 `
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);- c& z( C$ U3 t, W5 @/ P2 ^+ o4 S
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */) F9 T; y1 ~! n
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */+ S2 r: u3 `+ _ \
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
/ f( Y- e8 @8 ?- YMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);/ j* M4 R# |% v @" S
}
4 e1 E6 H4 t1 I; C$ y9 Y7 d) [请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
7 y a u* S3 G- p8 W9 y
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |