嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,: X' x) y$ @# T+ |9 v, p' i
input mcasp_ahclkx,! b- x" ], Q# h7 H
input mcasp_aclkx,& l% ?* ^1 [4 j- ?
input axr0,
6 C+ G" U, `8 L
+ I1 s+ n! i$ C7 A8 Y houtput mcasp_afsr,- T2 X( e, T+ ~' k/ F# ~
output mcasp_ahclkr,
M5 r! Y1 X; k; }' noutput mcasp_aclkr,
* ^. E' B; b# t# @: o* ]output axr1,6 Z0 P! o; w4 B8 h2 e) e
assign mcasp_afsr = mcasp_afsx;
9 E6 ?3 b0 K, s! ]3 jassign mcasp_aclkr = mcasp_aclkx;! ?8 k- T/ K9 V8 H) B
assign mcasp_ahclkr = mcasp_ahclkx;
9 y" r$ q! n% P( Tassign axr1 = axr0;
v" f& M: w2 P L2 Y, v6 c) {
. p) t5 D" s0 i9 h& M& ~* ^" B在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
$ M* v% c8 b% p) N" A- tstatic void McASPI2SConfigure(void)
$ Z8 Z* b2 I! ?1 a/ w{
% V0 V& A$ B/ x+ f5 kMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
7 J; y) e5 q1 s/ t- xMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
" k' A3 N2 l7 P. u6 d! jMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);/ O2 {- I3 _ c3 ?6 j
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
; B+ e+ q& b/ l5 g: ?McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,5 w/ p+ S( i0 U( }1 x4 D
MCASP_RX_MODE_DMA);, d( M. V" Z( m* p* [
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
, D# u' V% t9 u' ^& _* B2 i3 ?MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */4 r: B; w X, b1 M! R
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 5 k6 j" Z& E( R$ h" b3 i0 ^
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
' F1 j# v- G) l3 C; SMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
1 [0 m# Q' I$ IMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
9 r# t3 `' o) f6 U( t! A+ aMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
1 M9 |7 K* J+ e1 }1 zMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
5 V* s- w I8 p: N0 zMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
" Y$ g- _( ^: j( E0x00, 0xFF);
/* configure the clock for transmitter */
! h6 z+ \6 C6 _$ aMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);, s/ b* A8 V ~+ Y
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ; _& Q2 k: s0 ^6 ]9 p
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,& j- D9 \. h* u" T) B
0x00, 0xFF);$ J1 G# }; Y+ Y" ~( s
+ R' F" C% [3 }# a. G8 a, a/* Enable synchronization of RX and TX sections */
' @* S9 n9 l! T. ~. z7 z, CMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
( j3 s7 f. ]- |McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);4 z% F$ ], b+ w. [
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*7 V8 I: O. B# Q
** Set the serializers, Currently only one serializer is set as* }- R3 C' ?9 \9 `2 X
** transmitter and one serializer as receiver.# S5 x% k6 J) T; T `' n# b
*/ z3 U0 i$ W: _/ o" {: F4 E
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);- `4 M7 s! L% _# Y& \: g9 q2 {! X
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*8 V1 w l0 E. S
** Configure the McASP pins
3 A' X( p6 x' s1 R0 \** Input - Frame Sync, Clock and Serializer Rx
0 I" [. Q% D* g: x2 H/ H: Q& s** Output - Serializer Tx is connected to the input of the codec 2 q, T9 O0 \3 l: k( b2 E
*/; ~8 L8 u$ ~2 R
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);4 |* T% a) F x9 p
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
% b! U( |: I3 y* ~) n3 a( XMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
5 Y; j3 W# A3 @) l8 H3 j| MCASP_PIN_ACLKX
2 {; \- E$ i) }, p* e2 w7 N* w* V# P' T| MCASP_PIN_AHCLKX
1 p- G4 D) [' B$ c- R| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */& z- [# J+ p/ z: ?" w$ W& p3 H
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR & D0 X- S! ]9 j8 D) D
| MCASP_TX_CLKFAIL " z0 [4 J' }5 \( e% G3 R
| MCASP_TX_SYNCERROR
) H3 y% d7 ~) I/ Z* W# l| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
) o, q/ [. _+ s! Y0 {| MCASP_RX_CLKFAIL& y/ l+ s' J4 x8 f; i6 ]$ i! ]: ]
| MCASP_RX_SYNCERROR 0 f; e8 `. o% R8 r. g; f
| MCASP_RX_OVERRUN);
- W9 g- t- y$ z# h9 Y9 Q2 R}
static void I2SDataTxRxActivate(void)1 B. S0 F5 w% m3 `
{
% Q6 u; h" g0 H/ e% ~/* Start the clocks */0 g# o6 @3 ~0 U) }) p. Z8 _! M( d
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
L4 j. J, Y% w" j% ~McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */% h! | n, l8 Q. J0 B& ^
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX," Y7 A) R2 |- k4 ], ~; w) Y
EDMA3_TRIG_MODE_EVENT);
) Q1 l2 }+ g0 b4 `9 HEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ; X2 ~9 O5 J0 g
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
# C5 H- D5 v# e3 j& Y, X! sMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);. _& F$ ~1 C, r9 A, g) m& c& H7 j
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */1 I# b T: h q2 y7 F
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */+ Y' \8 q5 \+ @7 G7 d
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
/ c; @7 A- P6 f% ?6 y yMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
( K& F$ ?5 ^5 l+ W% e0 R& r) J/ N/ y}
5 X) m1 u' a8 r( J& V+ H
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
% [/ Q5 V. m, s4 g0 h
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |