嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
8 M0 d7 ~3 p pinput mcasp_ahclkx,9 f4 F3 s7 ~7 R) q3 r+ W1 e% k" a
input mcasp_aclkx,
/ N4 B8 F: a) @6 [. {input axr0,; g8 l" }3 k" T
7 y# O% p8 ]6 v3 | a- S
output mcasp_afsr,
* l% e9 [8 c+ ^; Ioutput mcasp_ahclkr,- v# Q/ Y' [3 o% }' a" l p
output mcasp_aclkr,& c y) D* ]' u- d i* g
output axr1,0 N E) y" }" v l9 U9 ] e
assign mcasp_afsr = mcasp_afsx;
' q; ~2 {" b: }# ]" R, [" M0 bassign mcasp_aclkr = mcasp_aclkx;! w, T& Z) G: N
assign mcasp_ahclkr = mcasp_ahclkx;5 t$ Z- V. f! X
assign axr1 = axr0;
4 Y: N8 O+ H: n3 h7 \
3 v, D6 ?- ?, R* b9 Q( g
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
' X* l* {) G; R3 l% g
static void McASPI2SConfigure(void)1 s2 s5 [/ {. A4 r: J0 J
{
' W8 J" ?7 W- e" P5 q9 M5 x) K5 z. uMcASPRxReset(SOC_MCASP_0_CTRL_REGS);" I; P* ^* ~( }0 J7 S3 ]1 G
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */0 }+ W$ T. j" ~. B1 ]0 f
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
' J2 D4 B& I; A0 m4 QMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
! l7 y6 l& j b6 Y2 m+ KMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. P- B4 ~# X( M. |
MCASP_RX_MODE_DMA);
- Z8 y: k( |1 v1 pMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- F8 i# c. E6 B/ ]$ W( |MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
, z' F( A- w1 \: y6 _- V3 NMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 4 _" C! \2 c& v8 r4 \5 n0 z
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);7 q3 W) ^$ b* N/ o% j/ Y
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
; Q9 q( g: L% q* y MMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
. M# y' N7 y4 b) A& jMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);4 Y4 j5 G) Y/ c, g7 I
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
% a+ o& O$ ^. e; S, sMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,3 {& Q( t0 E# f1 I
0x00, 0xFF);
/* configure the clock for transmitter */
- V6 ] H" t' |) P+ g8 d) RMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
8 l* e% [5 l" o; M# Q, LMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); # J- y _- \8 x3 x" k8 e& w! r
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,: ~, S( t4 ~( i+ f2 \6 w
0x00, 0xFF);9 C/ U' J3 \% e
0 Q& ?& L, ?5 D- Q8 V6 _; D/* Enable synchronization of RX and TX sections */ ) `4 f) a9 _. z
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
) E2 N# q6 w+ l L/ bMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
" t N* H; c# K, \/ g* F8 m. }McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*: e+ @/ w( ]3 {" N% u' r# [* A
** Set the serializers, Currently only one serializer is set as l8 {) L4 f+ h7 N- B0 G, D
** transmitter and one serializer as receiver.) D2 a2 E) ^2 M# W
*/" d+ d1 q) z$ t
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
, b8 y4 a% S+ P0 B, P/ y( lMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*6 J# a2 P& |! ]
** Configure the McASP pins
# v# Z; x. W3 K }6 @) H** Input - Frame Sync, Clock and Serializer Rx; M5 E/ u7 v: @: c! Z4 ~: b
** Output - Serializer Tx is connected to the input of the codec
, W6 I6 @& f3 Z+ H*/
3 N/ K0 K- _; ^0 A" r2 tMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
! v7 \& F f" H) u: E6 R8 g0 BMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));9 L( Q% Z1 P' a$ x6 v
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
8 Z* v4 @3 A5 y1 f4 P: f| MCASP_PIN_ACLKX
* |4 e' E* W: U7 j5 d( ?% H| MCASP_PIN_AHCLKX6 D0 Y* u7 p* p. D2 ^. X! c! |8 @
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
4 P7 c3 v# B; [4 T1 Q3 eMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 6 C. T; x$ S5 U w! v# b& |( L
| MCASP_TX_CLKFAIL
4 j" \0 X' J S. [| MCASP_TX_SYNCERROR
3 C5 P8 F& w6 l4 V F3 S) D1 ?) a. [| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
! G% e7 G; |1 I0 I# { q' r| MCASP_RX_CLKFAIL9 x2 [( ^4 H3 ^. q) H0 K! M7 U
| MCASP_RX_SYNCERROR
7 S3 ^) x1 S; A3 [- a| MCASP_RX_OVERRUN);, M. n3 F6 z8 j9 F
}
static void I2SDataTxRxActivate(void)# L* X( V. {. F5 H
{
0 N( d0 p$ a3 I- D% _4 P4 R4 ^/* Start the clocks */
! m M9 f% y% s2 O) wMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
! D% q: e) _. ~+ ^/ {) {McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */; U8 H2 ?! c6 W7 p* L# _! ?( Y( m
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,2 c6 {3 G. |/ a& a* s+ f' S
EDMA3_TRIG_MODE_EVENT);
; Y( \* X0 Y# I& M4 r% R# ?& iEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 0 G. f/ P" }. s# Q7 m% {. A% C
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
/ @1 U0 i# J. B+ WMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
5 J, K1 {( L5 H# s3 x& _" i* U! |McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */9 m) {% Q8 R4 K9 C( \
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
" K" f+ s& B1 e' O; OMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
" Y" I6 l5 d9 U9 D6 JMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
- p( V5 T- l$ e# w6 n- N' f4 h1 |/ r6 }}
+ _$ y) o& A7 A请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
. o. J. R6 k: y! R" d3 u0 I& Y0 M
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |