嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
( I1 Z' f6 C* O; d7 O* w2 {2 w; s2 yinput mcasp_ahclkx,
4 q0 K/ ]+ x# [# j& w, ]% j6 winput mcasp_aclkx,
2 n9 W% z% ^7 Q2 a# linput axr0,0 b" o3 e$ V. n4 w+ r
, h B( m ^9 `2 c3 N* ~$ G% Joutput mcasp_afsr,
; d E9 T; c- Q% |% Moutput mcasp_ahclkr,
4 z* L; X! V. D, i$ _: C+ poutput mcasp_aclkr, b |; q5 b5 ^) D6 m9 i8 w+ O
output axr1,
, B, Y$ R4 K' w: y
assign mcasp_afsr = mcasp_afsx;. c$ N4 w; u4 {4 ~
assign mcasp_aclkr = mcasp_aclkx;
) `0 Z$ l/ r# M* t1 ^" vassign mcasp_ahclkr = mcasp_ahclkx;" D$ q8 t; @: Q* W5 {
assign axr1 = axr0;
3 o1 V. A- \7 p$ m1 x% v. F7 P4 m" K
$ ]& K9 e2 K2 v: x- h% {, W在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
6 K, J: g$ u3 K+ o2 _$ y* j( l" I
static void McASPI2SConfigure(void)
c) L4 T: O9 C& P& ?{
9 c; X, x9 @. X" MMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
, X6 L1 m* _$ M, \8 sMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
$ C. v2 z/ k/ NMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);, t0 \2 Y u1 P9 Q7 X
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
( h7 x* I' ?5 D) MMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 f- g5 T! N: s! B+ q" r- k2 j& BMCASP_RX_MODE_DMA);1 w, M5 c8 s7 m$ `2 S7 E
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' [% o1 k$ Z$ u
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
" Z; B7 w4 d6 k: vMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 2 ]! A3 {# K2 L2 V$ `/ Q& T
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);7 l3 I3 V* Z; D& A1 S6 g
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ' o1 O: F# i" u# p$ {- ^( A
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
. t3 ]. ?$ f6 g* o0 uMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);5 C- m3 ?. x9 @3 _# |
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
# @+ b9 [ ]* N0 O" p. f* lMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32," }' n& c8 S; _/ {+ {7 U; f
0x00, 0xFF);
/* configure the clock for transmitter */
$ ^( q; _0 Y7 a: ?+ k5 TMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
4 U- d3 m- P# r3 ?& J9 W; B# s9 NMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
1 ~& o& v/ W# u5 }7 s* FMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32, T( z* v2 O- @- u
0x00, 0xFF);
2 [9 ?4 K: |' C; ~0 H( ]9 A j2 `7 h4 }
/* Enable synchronization of RX and TX sections */
7 U% v* l, H2 A# D3 {7 KMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */. S5 _* }) g: v- p$ C7 y% s
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
2 J5 S7 e/ q: W# KMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
U# q1 Y1 F k5 v8 f2 B% }** Set the serializers, Currently only one serializer is set as% q2 Q; u( ?* Q9 Y8 G7 ?; C+ s
** transmitter and one serializer as receiver.
# w0 J0 n% E; ^0 Y*/
& D! M% v6 B1 K0 D/ w% B1 mMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);" C- _0 j/ _+ Q& a
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*4 B2 ~+ `7 Y- B5 s, d9 M, {
** Configure the McASP pins
[ n5 D6 v! T** Input - Frame Sync, Clock and Serializer Rx# G% m9 p/ K$ E6 [+ n
** Output - Serializer Tx is connected to the input of the codec 9 S9 `0 k* v" h
*/
. x2 z' ` P( T/ w% eMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
% Y! S: y& r8 o5 i: Y: Q. |McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));5 |, h" `$ o( L) V2 B4 Y9 e
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
; Y1 v1 L5 V5 `: I; u$ O| MCASP_PIN_ACLKX
. W. J) J5 ^4 s% k| MCASP_PIN_AHCLKX! g K: M0 [' o4 A/ ?5 [9 K4 P
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */. ^/ ]4 V! s; C& X+ V
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR , z+ C, m5 _/ V6 d$ P$ b0 p7 D
| MCASP_TX_CLKFAIL
$ f/ f$ V; N9 R6 l| MCASP_TX_SYNCERROR
! r# r/ w7 [$ I% z' ^ C2 Z| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
. |( k; _7 R% l4 Y7 s8 v7 t) t G| MCASP_RX_CLKFAIL& s3 g6 O4 V3 c9 x: R3 D
| MCASP_RX_SYNCERROR 6 u1 {0 q% S: Q' e, M+ ^. m, L. D
| MCASP_RX_OVERRUN);* u) u% k) O+ M }) [
}
static void I2SDataTxRxActivate(void)
6 q5 m% f* c/ Z{
/ E! U0 _6 S5 j: k# m- Q/* Start the clocks */7 J, @) k- w8 x* f7 F- p6 o
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
* R0 Z* c0 U4 f# {3 fMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
7 e0 v, u4 m& s% h! i9 aEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,& K8 L; z* Y b- \: n7 F
EDMA3_TRIG_MODE_EVENT);+ ]2 T' D8 _8 C/ u
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
/ F! |. Y, V( f* a* u' B! l2 PEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */" Y' r/ Y; }( S/ v$ d1 T- X
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
+ x* m8 I. ?& AMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */. C9 Q: g7 I4 @( r8 x
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
0 p, a+ Q% X9 _3 F: T7 l PMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
9 o$ ^8 |0 H( k$ w: M9 A' W6 W& lMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
6 K6 ], y: j- |3 q}
' Z( w; t6 k0 Z" h8 l* j; }" ?请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
( j/ U% v; y8 g" V
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |