|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
5 P) Y9 [# K Uinput mcasp_ahclkx,
1 L+ o/ b( u6 C4 v5 tinput mcasp_aclkx,
) V+ R' ~! y4 E2 ?/ dinput axr0,; C1 ?7 ~/ i% u# M
& K4 r4 M1 D. o2 ?/ ooutput mcasp_afsr,) U. Y, G: g- y, ]* U
output mcasp_ahclkr,# w( A4 Z; b$ N! F& {
output mcasp_aclkr,
! r' N) A- S b7 `: Soutput axr1,
, u. @0 T3 _0 ^5 ~. q assign mcasp_afsr = mcasp_afsx;
% o, W# @8 H- G6 _1 bassign mcasp_aclkr = mcasp_aclkx;' E4 }: D' ?! [7 L
assign mcasp_ahclkr = mcasp_ahclkx;
) z* U" ^4 C9 S3 V% ^6 _; ~0 \assign axr1 = axr0;
. O1 t+ g* g0 b+ ]. B- V$ A& g
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
5 V/ s! O. O' }static void McASPI2SConfigure(void); I6 s* Y9 }2 b) g5 D
{
( J6 D0 k% N$ ?7 ~, X% bMcASPRxReset(SOC_MCASP_0_CTRL_REGS);6 U6 R% q7 d1 {0 L9 k. d
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */" u/ s) k5 r5 K5 N' ^
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
) _6 \5 r5 n# `% Z7 NMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
{" A7 M2 k! U; f oMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 @# d/ e3 W$ ?2 z" h/ T4 |$ u# E
MCASP_RX_MODE_DMA);% o4 M; Y! G0 P5 y) H9 D
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" V! G- S R' yMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
s; O3 V2 w$ w% C6 C! G$ @! x8 {2 j PMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
+ y" X8 _$ p/ j% O5 zMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);! ]6 L" w8 h2 j6 v$ H9 @' A" R
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
: {: |% [5 ^# O# D+ ~+ f cMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */+ h3 I- G" i) N( J
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);( {8 z! C) Q4 W: I( S( d' U7 y
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
9 n: y: j* F" hMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
! `- q3 [ w+ C" r$ w0x00, 0xFF); /* configure the clock for transmitter */
' Z1 C* K" t6 {' ^McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);5 _# J0 O+ e( \1 h& i0 }
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); / w) z/ v! n: f& s) ~1 E
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
8 M7 B; Q! h8 J8 u$ b+ G0x00, 0xFF);6 N0 x% k. v$ k& [
3 R5 M1 B$ ^' L4 }/ t4 x
/* Enable synchronization of RX and TX sections */
0 f. a, w, Z5 \McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */' M6 D& m/ A4 v4 y7 m1 X5 ?
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);. G6 M% }3 j" M3 r. _6 e
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*% X6 p9 f: @1 _. X, q: M
** Set the serializers, Currently only one serializer is set as. N9 o+ {; ]9 s- Q
** transmitter and one serializer as receiver.
: m7 C" k$ [6 T6 S*/
! W, X8 |6 K$ B1 ^3 u5 B6 c5 Z6 u' \McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);6 \$ ]/ R4 A. T: \5 @
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
$ R: n" s" Q# V( t5 ?$ d** Configure the McASP pins ( K2 b' i0 [$ M( k
** Input - Frame Sync, Clock and Serializer Rx) n1 t/ G; g6 W' Z% w. r
** Output - Serializer Tx is connected to the input of the codec / |. ]# _5 V5 }: a
*/0 w- a# H5 l- j0 ^! F0 R
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);# u4 o% E5 f& n* t/ p
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
3 d) p) U5 z5 n6 x9 DMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
- Q) D7 t6 X3 Y4 I5 ]| MCASP_PIN_ACLKX
& H9 M5 X7 B3 g4 p: U| MCASP_PIN_AHCLKX& g7 [* E) C) V1 a! [8 h
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
4 f, o+ Y, @5 b3 T0 PMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR " F% t+ C# U! C7 \5 x
| MCASP_TX_CLKFAIL
) o- x9 a7 `# V7 U% M2 ^| MCASP_TX_SYNCERROR
+ H, G6 f( H) K2 E0 K3 A! j( {' r% }| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 2 K4 [" B; N4 n7 g
| MCASP_RX_CLKFAIL. p% M- Y" n1 N/ B! E
| MCASP_RX_SYNCERROR % d1 J% }' v3 k
| MCASP_RX_OVERRUN);
" w4 G$ u5 j. o3 u# d$ ]' z} static void I2SDataTxRxActivate(void)
$ r1 t: \/ @( x; U6 V* g" s4 F) s5 ]' b/ }{/ V$ A* ]4 K. F, G2 t- G+ C
/* Start the clocks */. \7 G* ?2 P, W
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);$ @/ T2 E! X! }$ @! Y! o
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */9 _' f8 e! `7 L9 s( ]2 y
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
% I0 e' G/ H3 k+ jEDMA3_TRIG_MODE_EVENT);
3 G# h! r5 M. p4 E. uEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
; e, I5 U$ r4 j0 ^" `2 a/ \' rEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
* N6 r3 ^. y+ A9 N; `7 J% M0 `: TMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);# z6 _, F! W/ L: ~! e' o
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
& w- H+ {3 O' E. Hwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
6 m3 I( b ~6 u1 k3 _' CMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
1 }/ k9 E1 T3 f1 K& h# g% fMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);' F# P2 ?2 ^) a9 B2 f
} # k" B- n/ n( p2 `; w; D
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ' x0 ]$ }; S% m
|