|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,* g/ {5 z T. C- c
input mcasp_ahclkx,
0 I& ^3 ?. p/ q- I2 o+ A, ginput mcasp_aclkx,
. i$ Y- B$ v3 ?* t% Y B" Sinput axr0,
! v8 H- l) \- ?: X# B
' E. ?7 y' ]$ I" E/ ]output mcasp_afsr,: q, R* U. R2 d. G* c6 I" j
output mcasp_ahclkr,- a. s8 |) s! A
output mcasp_aclkr,
. {8 F p8 S9 S3 L) h9 O( }. boutput axr1,
8 h4 a* ^" M% b$ |) z2 w3 ] assign mcasp_afsr = mcasp_afsx;% [" h2 D& u7 D+ [7 c5 _
assign mcasp_aclkr = mcasp_aclkx;
c; ] K( A4 N& X: y/ }7 o$ J4 d3 Wassign mcasp_ahclkr = mcasp_ahclkx;1 Z" C7 P9 \+ R4 Q$ a+ r: R
assign axr1 = axr0; - g8 Y3 @8 H5 W( W
' U% |9 I5 o0 x {/ i
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 3 J/ M7 _9 S1 ?4 b
static void McASPI2SConfigure(void)3 z* k' f* B/ s6 m9 K* u* n
{
, ~7 c% Y% M- x* WMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
3 `; I* _# N( l, S* O2 Y) P1 y: PMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */* D: q6 x2 R% N
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
( S4 N: d( s7 \) i+ }McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
3 ^" F" ~; R8 HMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
6 {' e) c: e, p i9 b% w, JMCASP_RX_MODE_DMA);
9 T4 C0 J+ x5 G' D) uMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, u. x- u/ w8 [8 f: f5 h7 D1 c
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ s& Z& y- D9 L; a8 L4 w
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ' N, T2 L/ g' j
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);+ U' k: M9 e V) ?, l6 y
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 0 U- J% o9 F; W8 Q9 p
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
! ~' z, d* {: j2 v" oMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);, r/ H) {" Q7 j+ Y f# S, s) X
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); # e# ~3 y' Y0 z3 U- B3 Q3 J: d
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
^6 v+ `) L: `$ ]) C( F0x00, 0xFF); /* configure the clock for transmitter */
3 y7 G" ]" E' ~) Q/ ?7 M5 pMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
# w) z6 D" `/ O2 ?! Z: q) RMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ! w, }* P7 d: a
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,. ^3 R9 g+ y' B4 O4 W$ J
0x00, 0xFF);
M, s3 {1 c4 z h" G& W
+ D8 _' n( @6 `+ `: Q0 w/* Enable synchronization of RX and TX sections */ . I, e; ]8 m- T$ X
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
E' q# U" ?- M6 W& H9 n, ?8 WMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);* [. R$ t6 b( k
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
5 }% v) W0 @) \0 |5 q** Set the serializers, Currently only one serializer is set as
' a, T' U( W; T1 |: Q** transmitter and one serializer as receiver.( {, ], Q3 h" T3 v3 m
*/
) ]9 l* v$ x" H2 ] gMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);+ h1 e/ U. A$ k
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*& `7 x' X8 r/ I7 B) C. Y
** Configure the McASP pins ; U: ]6 o8 ^5 @5 X) w/ U) A& \& ?
** Input - Frame Sync, Clock and Serializer Rx
1 q7 s; _( Z$ M: E: {! f4 p. y4 S3 d** Output - Serializer Tx is connected to the input of the codec 5 b$ z1 J( y( a2 e
*/
1 e' D5 u5 M, wMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
/ w: N" H! V9 ZMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));7 Z) Z- Y9 P6 A- T
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX. x7 ^7 p& L6 a: T. ]
| MCASP_PIN_ACLKX0 }% C8 R: `2 m K2 }/ q' w
| MCASP_PIN_AHCLKX+ e! G% T2 z6 ^9 i; o0 k6 K
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
. E1 i" f0 D5 @* n2 gMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR % H% f m4 i# H/ x$ S
| MCASP_TX_CLKFAIL 8 L+ S$ y7 k* `6 E* s. d- h% Z
| MCASP_TX_SYNCERROR, i, T6 I! ^' q
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR " s; D5 | U. y' m4 f2 o: ]2 [8 L
| MCASP_RX_CLKFAIL. M1 O. z: e4 O9 H1 n0 G
| MCASP_RX_SYNCERROR : N$ j3 N6 [- I
| MCASP_RX_OVERRUN);
4 P2 E% x0 ~8 m; o) A} static void I2SDataTxRxActivate(void): y8 j' J% p% U! l0 a9 W
{
3 k+ M' K) e6 N9 D/* Start the clocks */
4 T( b/ ?( U5 X/ PMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);' {6 O* h1 h {6 ?( L/ n5 [9 n
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */% j, `5 u& j( y8 i( [( c9 ]5 Y# [4 y
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
9 I& P) V! ]8 q) H) K/ j3 g( dEDMA3_TRIG_MODE_EVENT);
9 `8 Y" c7 v% Z/ G9 {% N4 O, V, WEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
m6 e6 k% X% g* h6 z9 S& [4 n! YEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
, ^9 ?& h( p( C% `" T: S. c& X) d* X9 @' \McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);1 w4 ?: H \" Y- g
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */5 O% {' y2 E+ s7 I5 b+ X! J
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */( A' s) S$ K1 M4 G h
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);6 f3 q3 N3 G! K
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);! |1 `9 O t' b3 Q$ k) f# _" @
}
2 _- `; b% l. [6 P请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
- k" i9 L# a( B l |