嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
$ O* ?" ^$ l* C6 N) L/ Dinput mcasp_ahclkx,
' P3 V, U% _$ u: B2 p8 w$ Binput mcasp_aclkx,
1 P) ?$ D. t5 K; g* G/ M7 ^input axr0,
3 J5 K$ F2 `7 P+ L$ N2 w2 y; l, o! w& `! K& [9 P# h
output mcasp_afsr,/ Y+ N: \5 ^4 s( J8 Q
output mcasp_ahclkr,1 o# R1 z* ?; z& ?0 O' }% Y# p
output mcasp_aclkr,/ l* I. X' {! ?
output axr1,
) _/ S$ [, Z2 ]7 @0 S
assign mcasp_afsr = mcasp_afsx;
. p- |5 L8 e/ a7 t o( vassign mcasp_aclkr = mcasp_aclkx;
: V6 `! Z8 B# |: ]) Oassign mcasp_ahclkr = mcasp_ahclkx;" W! y/ y- H s; N7 \9 l H" e
assign axr1 = axr0;
$ A6 W* k; [, U; o" G; ~
" v9 [" B' ~# J& b B
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
/ F! M# @# p. P, Y9 l& astatic void McASPI2SConfigure(void)
3 c* S6 C2 e4 B- S+ w. q$ \7 k* g{
+ X1 ]0 Y. U& qMcASPRxReset(SOC_MCASP_0_CTRL_REGS);- v4 a4 A& V( R2 [3 H I* A
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
( r; \1 }8 e3 a9 P* VMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);! h" I0 ^: \" W: U; w. z
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */9 z( ~2 v, }9 @3 Z
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. G8 }( _5 c# Y9 ]2 w3 QMCASP_RX_MODE_DMA);1 Y! T1 N, P3 c, f( {: m7 `
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" V# \3 f D) A4 W- kMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
3 z! k6 T# C0 v7 |6 a% `) IMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ?, @+ x j, G" C2 d2 U
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
, v, K. Q8 N* b! p/ ~3 |5 KMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 1 B7 C/ M0 y1 u% D* H) P0 x
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */+ N7 C, }" `6 Z; P
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);/ v" }9 u4 m5 k: [1 e
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); " o- F7 G0 L" m U8 B+ X+ _4 F" v
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
2 C8 x" C( t5 J; P( v' s0x00, 0xFF);
/* configure the clock for transmitter */
2 ]/ b8 @7 ^7 B6 w1 x" a1 o' _McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
R/ V' M- {6 P$ XMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ) H0 K5 c: D, O1 x
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,1 U- }% m2 d% d# }
0x00, 0xFF);: Q$ ^" s" i% p4 c; Q; S, ?# L* W
4 l! k; Q# A, n$ b; G
/* Enable synchronization of RX and TX sections */
: P; E9 Y2 u& xMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
+ `& V4 ?7 {! i$ U+ x* {McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);) D+ h, C" R+ Q! Y/ j* Y) H: H
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/* A6 r! j' D" O
** Set the serializers, Currently only one serializer is set as
5 ]' w' [9 N8 P+ ^& ?** transmitter and one serializer as receiver.- P; l+ x2 j$ ?! o! J
*/0 u% }: C- M% M4 `; T& A, z5 t" ^, L
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
1 } D8 n- |' q2 s! @& MMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*" N+ ^+ D* F" x, E& j3 d4 W, p
** Configure the McASP pins
+ y; ]7 n: f) h5 y! X: `# s, J** Input - Frame Sync, Clock and Serializer Rx
+ b8 I4 }" U' ?+ j: l5 H** Output - Serializer Tx is connected to the input of the codec
; [3 {' P& N t' s, B6 L*/
9 p0 [3 G, w$ F3 b% V, m/ vMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);4 S5 w @1 c; R6 i
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));6 e4 }2 C3 W- m; n, U7 Q# y% f
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX1 T) U- z% J% I! G2 r# E: I& P
| MCASP_PIN_ACLKX
/ A& p* ?: |1 m! [$ `| MCASP_PIN_AHCLKX5 `8 p6 K# M" R# H1 b+ ?3 g) p
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
* D9 p$ o0 e9 p* D' j" J _McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR * Q% [0 B, N% d) E* }; Q D! }
| MCASP_TX_CLKFAIL % y5 E0 e2 p d- w3 l9 h6 H
| MCASP_TX_SYNCERROR* i4 h. k$ l' _
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
% h2 C- Q' d$ x' n) `| MCASP_RX_CLKFAIL
/ s) Y4 |; V# z# {| MCASP_RX_SYNCERROR
2 r5 }& @/ X/ T+ x/ I9 x) }| MCASP_RX_OVERRUN);
% R% c% R3 L. h M$ f: x# t7 M; j, v}
static void I2SDataTxRxActivate(void)( Y9 M+ C1 ] O; Y6 a, @
{
% P0 l0 y6 b/ I7 F1 ?+ ]+ |/* Start the clocks *// E b; g' _. [
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);$ z# m' t$ I6 z; O5 y1 n
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */( k' i5 w7 y& u$ a' k" Q E
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,+ M& M) J4 M' X5 X4 a( R
EDMA3_TRIG_MODE_EVENT);
4 {5 N& \1 g) MEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
, U9 q o3 t8 W& ]EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */- V4 P3 k0 W9 c
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);# v# c9 x+ {! I) c
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */# g; R4 }0 e2 w1 S; w. |
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
( j- g7 Z1 r; j$ T3 b4 j2 ]McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
' Z' R6 B& ?$ B) ^2 ZMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);7 y3 D% F3 e0 X6 k
}
3 N( x9 D9 I1 i1 v, l6 B请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
7 e0 [/ X2 }3 A9 M
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |