嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,: x2 ~# }; J# b( I) h- F
input mcasp_ahclkx,; I" s( B% ]- \ B3 r& v4 h6 C, T
input mcasp_aclkx,: ^: z. K, W# l6 D. C) H
input axr0,
5 m3 e6 i+ k. l, i* \1 o* n9 }
: }0 g4 w1 x2 v9 koutput mcasp_afsr,- A" M; A2 q+ ]
output mcasp_ahclkr," O- [- J# `8 }' ~
output mcasp_aclkr,; l$ P, a7 h2 g! Y; D
output axr1,7 I5 O5 s% b2 V4 T4 l! R, Q, ^) N
assign mcasp_afsr = mcasp_afsx;
- @# l* p7 V& h1 @2 Iassign mcasp_aclkr = mcasp_aclkx;
! q+ k/ {# `* O8 sassign mcasp_ahclkr = mcasp_ahclkx;' r+ Z$ {$ Y: r# J$ D
assign axr1 = axr0;
1 g% x; L- E) ^1 ]5 Q; R3 ?+ D% o' R4 P4 T$ ]
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
' Q) [% u6 v! u, u2 E1 qstatic void McASPI2SConfigure(void)
: e+ C) A; w( W7 N4 u4 |{
0 V' k' o) D0 F! i3 DMcASPRxReset(SOC_MCASP_0_CTRL_REGS);; N# d* z( ]) K8 Y: B. |9 o
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */, p9 g; ?; Z, Y( p! n
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
1 @/ \9 a6 [3 j- e' MMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
* F4 @5 G) G1 X3 }1 kMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 H, Y6 k/ R$ Q! J$ j% A
MCASP_RX_MODE_DMA);5 r2 c) _1 ?8 R, P" A
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# @* O$ c' H8 a# T, jMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */# `% I; F, D: ^7 A& z
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
: m! X2 c1 M' M) P% @; ^MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);6 y+ y; n3 X4 U6 U) g3 @7 i1 @
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, : \6 M9 R# [$ d+ P! j; e T
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */ v8 q( @2 u% u! ^3 u2 z T1 y
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);8 e# }$ _. u: @% E- S
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); , c. f6 `. \ k# @& O
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
R$ q. k# x7 R9 H0x00, 0xFF);
/* configure the clock for transmitter *// N9 q- ^5 U2 p# h
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
8 \! a9 Z: O7 G7 N7 [McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); / D: w, D8 y9 m) R* k
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,8 z# ]9 i3 _. ^/ p* V
0x00, 0xFF);
- v0 [) e0 e% T2 J! s2 y0 B: d/ g/ z0 W: x# }6 ?
/* Enable synchronization of RX and TX sections */ $ u6 y# A' W. ~
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */3 K& T( ]* ?) c
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
- U# d+ x$ f+ ~, c. k7 B! rMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*' p! a( I6 E D
** Set the serializers, Currently only one serializer is set as8 u* {: h" I7 b( y4 [( l# R
** transmitter and one serializer as receiver.
* d9 k+ G7 m' b*/6 t/ X% K% u# X" ]: f
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
% D% e& @, ]9 S$ ~% wMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*( m" r H8 ~6 J) x: d1 R$ `
** Configure the McASP pins 1 [7 N! T9 ~+ W
** Input - Frame Sync, Clock and Serializer Rx( q; S7 \1 m: h8 [* k8 w
** Output - Serializer Tx is connected to the input of the codec ( W" y4 x* |# v. ^
*/
4 n+ p0 v- a! H! Q9 p, TMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);0 Q( R& V1 A3 k$ ^# j
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
8 x! O+ D* y! Q! Z& s1 O1 K" [McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX( ]4 B: T$ H8 X; A5 b
| MCASP_PIN_ACLKX
) ]" @# x9 M7 l; S4 e2 }| MCASP_PIN_AHCLKX
0 I: W- a2 w3 Y0 m| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
! N" Q; _0 g' D4 DMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR + _* A" i4 z: r* F9 j5 ~/ {
| MCASP_TX_CLKFAIL
+ K) N- m3 i$ V8 I/ o% r| MCASP_TX_SYNCERROR
6 i: ~' [4 M5 U, Y+ Q( O1 `| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
* j5 E5 {4 w @" H5 r| MCASP_RX_CLKFAIL
' e. x" a7 o+ q6 B5 Q0 F| MCASP_RX_SYNCERROR 2 _' f+ t$ P, V
| MCASP_RX_OVERRUN);
' _. k- d5 N+ \8 D: n4 l7 W}
static void I2SDataTxRxActivate(void)% n `* q1 l3 m% g3 |$ `& x# X
{4 {# k, u0 u( i9 N
/* Start the clocks */
7 q% z' M1 E IMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
* u- {" G8 Q* J4 O8 I9 CMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */1 `' L; e2 A! ]' v) _- k: T: ?/ R
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
) F8 ^! Z8 N6 z) zEDMA3_TRIG_MODE_EVENT);! K6 T }# T2 `% v3 j% I
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 6 |8 E" X- [0 ~6 o8 ^7 m
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
4 v) g. i8 s# O9 CMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);3 G( j( B9 R* k" X. ]
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */# l5 s/ O/ M5 X8 X2 e0 L2 T
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines *// D0 J, W/ [( ? m
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);' n" M n6 j$ U( M+ g
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);! n! `$ V3 F8 N7 w, ~
}
% H+ D; [, k ^" O' k# P0 B请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
' }8 p# d$ }7 d3 `! U! }; Q6 T U
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |