|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,) H3 T$ V9 s; W% R6 L- ]- {3 [
input mcasp_ahclkx,
& x& i% v9 [8 Y* A2 Iinput mcasp_aclkx,$ h) ?+ ~; S2 D1 B1 B
input axr0,
' O, v1 t, |7 I! A" K4 Y" [4 v$ e" w3 o6 m
output mcasp_afsr,
: W8 S6 D4 f' ?) _8 |; m2 joutput mcasp_ahclkr,# X/ k9 @! I. M0 [1 |3 G
output mcasp_aclkr,9 U) K2 m' Q7 l0 @) w
output axr1,
4 @ S8 n2 v# i9 X; B0 y7 k9 k assign mcasp_afsr = mcasp_afsx;
* I9 W, W6 x: R7 r4 J4 l- i1 Cassign mcasp_aclkr = mcasp_aclkx;+ @2 {; v, u7 |( a
assign mcasp_ahclkr = mcasp_ahclkx;2 h4 j* N! G+ R0 |
assign axr1 = axr0;
( g1 I1 I5 j! ?" ?* Q* _
& j* X/ k$ d2 N6 `( b8 l! N在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 3 y( ~6 O n. l' d8 X
static void McASPI2SConfigure(void)
. _- c( h4 s6 J; t; L{7 j: r) R9 H0 k4 F. m9 T
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
) K5 S6 ~! u" RMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
2 B+ {0 v3 t8 ~# [" \McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);/ n3 U* f' v/ k8 {9 @' F
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */- K6 A, `9 |1 B* z" y/ h
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# {5 G, F6 j3 i3 jMCASP_RX_MODE_DMA);
7 m+ y4 N' Q/ O. |) pMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- T/ [8 A, H- e$ b9 [- D6 xMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */% P5 F( Y2 E) P
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, $ Y* E% E; r4 q" U1 K
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);1 V2 [" v9 u; t1 Y
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, G- v% Y4 R5 S1 B, J
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
6 [2 x( O2 {5 W8 t9 M$ v" i7 `$ ^McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);( W) n" ?4 I% ~3 l. k2 r
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); - ^* q+ \4 F1 B
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,0 g9 s4 e/ w) E- T0 `
0x00, 0xFF); /* configure the clock for transmitter */
9 p: B( z2 f; n) ZMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
?6 \* w. v: T- _McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
* s. O- ` W4 ~McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
4 b6 R$ H9 L9 s& w0x00, 0xFF);
3 n: z+ ^: r$ V% a
& W8 P) l F+ ` Q/* Enable synchronization of RX and TX sections */ 8 \4 p7 J; k6 `) J+ _0 f7 u
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
6 t6 V z: f$ `& k+ F0 y, \McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
$ T4 ?" N( `# l. v. AMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*5 F$ R% I$ r, q! o, _ P
** Set the serializers, Currently only one serializer is set as
$ O$ c/ C0 m+ B0 a# \** transmitter and one serializer as receiver.6 j( b# U7 T# W7 _
*/
3 W g, U6 E5 sMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);7 j" V7 } S" M2 T
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*1 f! [1 @, F/ T
** Configure the McASP pins 9 l: v& Z }+ H6 u8 z
** Input - Frame Sync, Clock and Serializer Rx
4 f+ k: b' h6 P9 b** Output - Serializer Tx is connected to the input of the codec ! q) Q: ]% j; D
*/
: i% u% t# ~( f* f7 S5 m0 VMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);/ v; ^: z# D( ~8 L& w; h
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));$ A3 b. X% q0 t3 I
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX' g: ?' G% y9 h2 w/ k8 |
| MCASP_PIN_ACLKX7 g* b9 F0 k2 g- v! D+ Q: G3 M
| MCASP_PIN_AHCLKX& E) b6 \* N8 c9 S3 F& y* p, _
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */+ d/ q) Y% ~6 {( T J
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ; B3 P+ U# T; i+ F% s) i
| MCASP_TX_CLKFAIL / Y' u9 f) V" g+ |
| MCASP_TX_SYNCERROR4 s) y/ }2 B! N; Z3 R! y9 A
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ' B; y* H+ o2 _
| MCASP_RX_CLKFAIL
6 H3 v$ |2 B! |$ o+ Z| MCASP_RX_SYNCERROR " e, n1 }+ v2 ^9 G) r* c8 k7 s
| MCASP_RX_OVERRUN);. ?2 M8 i% D. L7 [
} static void I2SDataTxRxActivate(void)
" [. q' E7 T; j# S{
% a w4 k9 l0 H/* Start the clocks */
# z; z/ U ^2 s. X" c) Q( m2 sMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);4 l; W8 z9 `1 m7 }
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */: E' O! s; U! z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
9 R0 g0 f1 V" B3 i* x) pEDMA3_TRIG_MODE_EVENT);
0 m! @% e& D: T% g8 LEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ( |+ k2 `" D3 x* i/ S3 K2 n8 W4 f
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
2 k2 M9 u0 {; t) ]McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);. p% q1 [. J4 ?" L0 H: i
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */; s) ?6 ]) Q G& ^* [/ e( \, G% @
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */1 q% U- g9 }7 K) c0 Z y
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);$ ]3 _ ]8 I/ {: q/ ?
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);9 K+ ?9 @% S! n5 I
}
5 u( Q6 L/ B& ^: [; z5 ]6 f. v) n3 F请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
`2 F. T* s" M. {0 K |