嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
& |' ]" S$ C/ g: v; n. P% V9 h$ d$ Rinput mcasp_ahclkx,. E3 A; n% P+ n! \) |% T8 L
input mcasp_aclkx,' i f( t' [2 p! ^
input axr0,
: N0 b; f% ]3 z* v" e# W4 d+ y, E$ |. W1 J+ {/ P; g
output mcasp_afsr,5 H8 b% w$ J" ?, q
output mcasp_ahclkr,% {% C/ W% G0 Q5 z; M; W& m
output mcasp_aclkr,+ l9 v6 m% Z0 j" L3 I
output axr1,
. F4 K$ e- L- _( Y9 |1 d
assign mcasp_afsr = mcasp_afsx;
; @/ e7 C+ F" P3 C$ Q O) N: wassign mcasp_aclkr = mcasp_aclkx;/ l+ G. D, c8 T
assign mcasp_ahclkr = mcasp_ahclkx;
' k; B6 z+ E$ b6 F4 X6 b$ R4 a" l6 ]. Hassign axr1 = axr0;
: \" G$ I, ~& ^3 s) j$ R! m, @) ~; B" ?% }, W( L
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
) U! R" q; ?( e2 G4 S& f$ |static void McASPI2SConfigure(void)
5 h! N+ K9 {- ~% L9 r{% p1 }/ e! p! G+ {, _/ r5 I" O2 G
McASPRxReset(SOC_MCASP_0_CTRL_REGS);! E3 N+ R! u/ b! o4 V, u& L
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */0 J, W q9 q% Y+ R3 {
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);% x6 A. u* h" s! }/ P' V
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
4 L( ^+ u5 R; zMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; ]: C3 m' h1 b" \
MCASP_RX_MODE_DMA);) l# R- w' ~% _0 \
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 [/ h |; \2 a- Q) e- n" AMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
. Y+ V2 M( R" K1 i9 D! ~McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
$ q+ w6 e+ B- u* gMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
$ x5 [; b3 h% \7 W. I0 X4 lMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
$ |$ y& h! C# A% KMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */* S2 n, b: b! h$ ~. [" x: W8 C
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);! p+ g! O/ ~) [" i
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
' s+ K4 Z, U( d/ ?- ?8 FMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
( V3 x2 Q- S& S& g0x00, 0xFF);
/* configure the clock for transmitter */. e5 N5 @: o" |
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);' K* k' x# k' L, p4 w! m
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
- T, Z4 J' @7 w8 h% OMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,, u- ^% _/ a6 d2 B4 p
0x00, 0xFF);
- d* e) f" j e# i
" w% C. M6 L$ q# @( A+ ]+ k/* Enable synchronization of RX and TX sections */ 7 N- i$ ^: e: e7 V& ^1 @
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
! x! T7 [6 k1 n4 J) T% CMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);/ g9 g( } T0 k, M
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*- X# d8 v& Q, x6 q
** Set the serializers, Currently only one serializer is set as
1 N+ `+ }! y6 B# o# \( d** transmitter and one serializer as receiver.0 |5 t, {( E4 G; b
*/4 j- [" N7 u! R7 @
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);3 g" W. `" N! Q0 s( O
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*8 m9 T t1 i, O7 G- k
** Configure the McASP pins
Y; u* n6 f7 y9 y6 g1 @** Input - Frame Sync, Clock and Serializer Rx
/ Q B0 n: I& x9 J** Output - Serializer Tx is connected to the input of the codec
! e2 ?$ p" }/ R% k* J7 z1 i*/1 O2 N' s: J0 p* |% G3 l, _
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
' }! C3 |/ l1 T; m2 o' [% zMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
$ Y8 L/ F0 \2 e3 P7 h% H$ mMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
4 ]% W; b( F* w| MCASP_PIN_ACLKX* ~' \$ h( i9 E! u
| MCASP_PIN_AHCLKX, Y; {$ A2 F" B3 z* |
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
6 _9 a- U" B FMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
, `/ E' M3 P9 U+ L1 F4 A| MCASP_TX_CLKFAIL
]: U- Y3 ^1 g- d0 I4 b| MCASP_TX_SYNCERROR
; y5 F2 w5 o+ x; |, C% e& ~0 T6 _5 t| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR . v5 T- _8 C( f4 ?9 ^
| MCASP_RX_CLKFAIL2 F$ B+ H. F: g' v" }2 \
| MCASP_RX_SYNCERROR - W' {& [! U* T( F' {- ]
| MCASP_RX_OVERRUN);
. ^1 C1 j" H& s, h' s6 R1 |+ o}
static void I2SDataTxRxActivate(void)' ~& h5 C0 O: W) w, |
{
+ w1 b8 i- H6 D( e. ~/* Start the clocks */$ h. [) ]9 X1 |0 b. B6 R% V
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);: ?2 O( ?- j K n
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
' X2 s Q; \$ H9 k; V% KEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,; A1 W, J8 ^7 P9 d" d
EDMA3_TRIG_MODE_EVENT);
+ x* O4 b( \8 u( O6 ?! xEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ' t0 V0 z/ O1 d& O+ S& a) ]
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */# O" |( `+ G& f- d
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);( @$ r3 K) w! g$ q" [
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
# J0 Y. W; S lwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */. r# |* ^2 h; e1 L
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
! i# O Q* ^& y+ t4 S( [$ dMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
0 E4 T( s. A. q3 N* _1 D}
% ^% }) F$ q# G) b请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
1 [; c% r0 j- N1 w$ E) y k
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |