|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
9 q2 j" B1 s. a3 |1 }2 ainput mcasp_ahclkx,
2 q5 |, _" G* J# F ~0 Y; Yinput mcasp_aclkx," w$ b* j6 f( C( X, T; x- ^
input axr0,
], Q# p5 s- w+ I' E" K! C! \) @0 R/ k7 ^
output mcasp_afsr,
2 L* P5 E& n: S0 e2 A: @. i8 \output mcasp_ahclkr,& ~4 z' t& x! ~
output mcasp_aclkr,
3 I2 t* N, l$ g3 ~8 E: aoutput axr1,
& a2 [1 `& j2 `+ q y* b. b assign mcasp_afsr = mcasp_afsx;
; I1 F+ ?' A* `0 Yassign mcasp_aclkr = mcasp_aclkx;
L3 ^ S( e; j7 J* Q: U- jassign mcasp_ahclkr = mcasp_ahclkx;
. J2 {- ^, M! j6 l2 O3 k$ w2 yassign axr1 = axr0; $ J. n3 z' |4 h) G) R) w) ?
8 ]& p8 R3 i: b: S( p/ v$ S: i: v
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
9 R7 G1 h$ F% T$ _. N# p8 lstatic void McASPI2SConfigure(void)
1 g% i1 U8 K& M- a2 r9 Y{
3 c# R2 a. p0 {" KMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
/ U4 F& W( g# j% DMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer *// a# }0 U3 c! K b! v/ R
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);5 k7 o! ^( B. n- Y% h) r4 W
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */) ?" q0 C# D, K7 S
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,1 G; p% l+ _8 J# s+ v0 S
MCASP_RX_MODE_DMA);# z; o( g$ H5 G1 D! K
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE," T! l& l2 `+ p2 S8 J8 x/ @8 U
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
! Q" i; x9 }9 q' xMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
% `0 v% Y2 d0 N' o% KMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
6 y1 l& B, Q# T. o; f$ V# H* RMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, - D; g) u2 r( |; h% Q" F
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */- _3 c0 y' {! X9 ?& c5 h" O* l
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
# Y! M- W: \$ T3 a( h5 zMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
' ]# _$ K) v' L! w0 x4 [# gMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
$ Q% ~) |/ B1 V0 q0x00, 0xFF); /* configure the clock for transmitter */
8 ?9 r7 R" i$ B) v( yMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
" B4 }! D2 f7 M( A# ^McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); " q0 m& V, }4 `9 z5 {% h/ z% o
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
$ t! y/ |1 b& Q, |" r' h, K0x00, 0xFF);+ n" v1 C0 i \6 N2 f8 z/ [& ?
0 x2 U6 z+ `( F+ p& D V/* Enable synchronization of RX and TX sections */
" ]% ^: b0 M5 \McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
, ~2 M5 }9 t- yMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
: ~) @, L. c7 z3 AMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
: v$ X* N+ p8 U" w** Set the serializers, Currently only one serializer is set as4 x5 }3 U3 T# F% C
** transmitter and one serializer as receiver.& s: R3 x# [% q& y: L
*/
; t' O# |$ f# E% @McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);2 O& @: o9 e6 `! [8 q+ _
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
9 g1 D `9 f$ b- P+ r6 D& N** Configure the McASP pins ) ^* P9 A! J0 I1 ~7 l# ~+ [- z
** Input - Frame Sync, Clock and Serializer Rx
& m$ e. P6 p$ o: x! i7 i** Output - Serializer Tx is connected to the input of the codec Q7 s+ K" L6 h! D
*/- k+ A) U1 m W+ N4 B
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
4 H3 K- F0 R0 t$ |; YMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));+ c% j/ v: _+ M, ~ K
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX/ O0 m9 v) T! j1 O2 U9 D
| MCASP_PIN_ACLKX4 f; S* a, F& V1 v+ C
| MCASP_PIN_AHCLKX/ `* ^8 C5 z1 Q9 S3 e9 u
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */ B: S# |. b* M* A0 @! ~0 _1 v' F
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
8 }' K1 C! Z# S, \| MCASP_TX_CLKFAIL
! `0 s+ p; Z! ~| MCASP_TX_SYNCERROR
) \" @9 a" X" A* l6 ?) i0 i| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 4 T& G9 g# [& H# D$ p- a) ~
| MCASP_RX_CLKFAIL( M: a) G, G/ `3 m3 W
| MCASP_RX_SYNCERROR
& B% t/ H) o3 R| MCASP_RX_OVERRUN);
0 p3 P1 A$ S1 z3 d2 h} static void I2SDataTxRxActivate(void)
2 t" t! l# ^$ B, D2 r7 P6 h{
/ F9 O7 ]0 O; _0 s/* Start the clocks */# `: x Z& [: s' a$ m
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
) @: ^3 b8 u# L8 L1 f( B7 B1 PMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */: E# U4 I, \# n9 h( ~, y3 Q) s; X+ w
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
0 n: @1 t# K& |0 ]1 T FEDMA3_TRIG_MODE_EVENT);" j2 L0 m. E, }& Y3 f
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
! {' x; ]3 z- H. ^% P. mEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
7 G/ i, u0 j4 C1 {! FMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);. }1 t- |. J, t8 o2 @7 [
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
* q# j A/ g5 r- s9 m- ^* | Vwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
( x" ^' T3 v1 x F6 t6 {) PMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);) k/ J" y- ], @4 U: I
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);$ Z/ \! F* ]2 t5 `& o2 _: F% u
}
$ X/ H. | C% v# G j$ D# h请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
3 G) R1 ^) v; B5 N! U |