|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,& b! L( B& B' E; }' J
input mcasp_ahclkx,
+ _; t; `; [) z% w3 ainput mcasp_aclkx,6 ]5 [, v" x. I+ A8 J6 R
input axr0,/ y( p" j% W0 R6 z5 Q
0 {+ h2 K# S1 o7 E/ [1 Joutput mcasp_afsr,
, n. ?" Y5 ]* k8 q- L( o+ m* {output mcasp_ahclkr,
, P& E/ K; ~4 i% J! j8 Boutput mcasp_aclkr,6 Z& n H: l; f+ h' z
output axr1,
% i, t0 ?9 R$ T$ P3 p ~ assign mcasp_afsr = mcasp_afsx;, _7 ]( k- O/ v* R
assign mcasp_aclkr = mcasp_aclkx;8 m4 k6 ?$ N* b& R
assign mcasp_ahclkr = mcasp_ahclkx;
7 E2 F1 _( G/ ]assign axr1 = axr0;
/ F$ _) e* g% J) T7 J4 E1 Z w/ \ C) N( i) l4 j: g5 j
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
- b0 D" S! H3 }$ O. N: Vstatic void McASPI2SConfigure(void)
+ i& I" f+ |) m% a) F1 k; o{
) g* |0 }) ?% u# \: l/ y* _McASPRxReset(SOC_MCASP_0_CTRL_REGS);2 s* \% w0 ]- z: L2 U! \
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
; S, c4 ^' B7 y1 i8 q* kMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
# t) h$ K1 R3 F, w+ T8 q& ~McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */! E2 A( Y( ]. m8 R
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,8 j2 A. I0 r& W
MCASP_RX_MODE_DMA);2 l; C9 d7 m3 O6 J2 I7 Z
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. s: r; X" Y. A' @7 MMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots *// |, V6 u& `' Q( q+ T( ^2 W0 f
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
" ?: H8 {$ ?) D" g3 p: bMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);, G8 R( L* Q$ G
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 5 t% ~/ X1 d% q
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */, f; F9 `# q9 V1 E
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
$ {2 ]- D8 @% \8 a5 g" SMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); " x1 V' ~$ ^% U5 p& |6 w( I
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,( n" B1 \. r5 Z- K
0x00, 0xFF); /* configure the clock for transmitter */% U+ N2 _/ R5 H7 H% [+ g0 m5 u- Q/ |
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
3 g5 ]* E1 D4 M% S& QMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
( E' k% X. }5 }9 q2 P$ R; TMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
- H1 v* V- Q4 E: ^# q' T0x00, 0xFF);
! l; X4 ]9 T* {$ O5 H q" c
9 m- N9 R: ^0 F8 M' d/* Enable synchronization of RX and TX sections */ 6 v" `) I4 V* }/ Z: X6 Z3 E# ]
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
; X+ S& j: E& @. BMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
: ~1 f: B! c1 ^' xMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*- J! o# n6 j/ ~: ~3 u& q# t2 R
** Set the serializers, Currently only one serializer is set as6 j0 W5 H. U" ^- P: ^1 U
** transmitter and one serializer as receiver.
8 g! j( o+ W- P/ a6 Y2 |*/
3 ?" p) G0 J* K0 `/ `2 ^0 z9 r% ?McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
9 V- `% O. E3 e% H/ {McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /** O& W6 _' p/ _# W
** Configure the McASP pins ; z$ {1 K" w* A9 s
** Input - Frame Sync, Clock and Serializer Rx
( j: C8 h0 ^. O* }** Output - Serializer Tx is connected to the input of the codec ; N& i5 j. ^8 o
*/
4 u4 H9 W' ?" E( hMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
5 K6 D4 k$ k! l, c7 x9 Q( ^* YMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
1 S# J7 i8 u) n) W; ?0 c5 JMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
8 {8 K1 c* I: z8 R( c| MCASP_PIN_ACLKX' P* U. A j; ^4 B F* p5 A) |
| MCASP_PIN_AHCLKX$ g; m2 c P3 M
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
9 h5 T x2 c( rMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
/ ^5 `& E# z; V) C s8 \| MCASP_TX_CLKFAIL 0 B$ x1 N# U: M/ O
| MCASP_TX_SYNCERROR
: `: d: X1 G. X; R( q| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
/ U+ e& S) R2 s| MCASP_RX_CLKFAIL2 h# @" {% O0 G5 Q# t. D
| MCASP_RX_SYNCERROR
+ K# M* M2 F$ v| MCASP_RX_OVERRUN);
0 } x) m- x# t& d$ B} static void I2SDataTxRxActivate(void)* I$ p5 A- J4 {- I1 g
{- [; J9 [6 F. c; f5 m9 X# F6 p% ~
/* Start the clocks */
" E# D$ v; @: W! n) _- O) d, HMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);9 [; B. }. B8 k; J( F! C6 v i
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
8 E9 L, `& r* r4 f7 ?+ T WEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,% ? y/ L* X) x: O$ e- I
EDMA3_TRIG_MODE_EVENT);! O+ _; H% g/ a% ?
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, & q6 a- O4 }& l/ N8 M! q+ |' G
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
% y6 z8 Y. J( y- M: k6 ZMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);4 Y- G; l0 e: M" C8 Z# R
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */: M( H e7 S4 R3 e
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */ O0 O- z0 p+ v* q' X9 x- r% V
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);5 |! U; W$ |" y8 x, d7 `. W
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);7 A( S+ \- u: N! i, f
}
( d- O1 v0 @0 Q2 W9 t请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
, \6 Z6 M. ~0 i6 z/ R% Z |