|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,( D' l9 K, b: ~1 }! }+ `+ x% y5 D
input mcasp_ahclkx,: J n$ J- ?" \/ f. R) J D5 j
input mcasp_aclkx,
- `5 q) i1 M% V- ~; T) c7 Tinput axr0,0 {! L- Z8 ]) u) Z/ S9 o: V
# x! w: K) l1 f' O0 v1 \
output mcasp_afsr,* Q- z- s- o" t; v
output mcasp_ahclkr,: w, z4 H) M! J7 q3 Y. B
output mcasp_aclkr,
; g2 |. f5 B# Ooutput axr1,
9 e! ]* ~9 u6 C6 d+ Z: n assign mcasp_afsr = mcasp_afsx;' o1 m; y( l, B5 U. F6 W5 A
assign mcasp_aclkr = mcasp_aclkx;# h' r4 ~* J% P& ^( o9 {) ]
assign mcasp_ahclkr = mcasp_ahclkx;
: A- T. x, U: |7 T* X( @" p' }; passign axr1 = axr0; - L4 o" L/ k# V' a7 b; v+ ~/ `
0 s( _# L4 r2 p) J+ c0 T在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ) Q: Q7 w, k/ C; p
static void McASPI2SConfigure(void)0 c' J# G/ J( ~4 d+ C8 m" p* [
{$ E5 Z( v( Y# K" Z
McASPRxReset(SOC_MCASP_0_CTRL_REGS);0 N% y6 @- q% m* `
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */8 J( B/ F$ P; h& x
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
; L L R9 h9 k" D) sMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */; Z& a4 {; D; @! f* I3 Y' |
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* y# }8 l, K7 XMCASP_RX_MODE_DMA);
6 h4 h( r9 n# y! D2 CMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
A5 O! r& i+ `: p' l5 U7 LMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */- f! q/ J7 R1 c& I, j6 |! Z- T: K& r
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
! p% F" k. K; O2 o; G$ HMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
2 K4 p0 _9 i# _: NMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, " q" q" T+ l. C0 h; C
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */& _+ z% ?" j7 r) ?. l
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);) W. k0 ~' T) K! ?7 y+ {
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
' Y4 h. {$ m. b2 JMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
( \4 ^ V. j7 a, \. |0x00, 0xFF); /* configure the clock for transmitter */
2 B& C: W6 j+ k- U# GMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);$ F$ E& r8 W2 q% i' n" C
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); % K5 V8 J, H L
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
( y" J w- k: c" G/ j0x00, 0xFF);7 [1 G. s3 N/ {: E5 a
8 C; N0 ^9 S& B; z3 M/* Enable synchronization of RX and TX sections */
5 @+ ~. Y0 R/ r. YMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
. W4 z% Z/ y+ Y7 q6 r# T. j! c1 PMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);+ e2 ^! m% j( s# ]( }- z0 J
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
3 ^; C5 c& Z2 l0 e' m8 U. D** Set the serializers, Currently only one serializer is set as
3 A/ k3 p7 f2 _9 g** transmitter and one serializer as receiver.$ O/ G2 \) s# d/ Z
*/
0 G, V5 b( E g7 H: L' HMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
$ i/ k' p" k! D ]McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
]$ z1 d' P# P; {) |** Configure the McASP pins
& l8 B4 p9 y6 d7 |% r** Input - Frame Sync, Clock and Serializer Rx* c* s; X6 `4 r5 d1 e+ R
** Output - Serializer Tx is connected to the input of the codec y0 l- A) M' e; D( ?. o
*/2 ]% T# R/ {4 n' m
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
: `, b* [3 O& S- K/ ]1 FMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));. ~1 |0 `8 v$ y2 S8 I* b
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
+ U7 S0 k+ x" {* k% j" _8 K2 y" h| MCASP_PIN_ACLKX& u( r0 n q: o8 D5 d3 d
| MCASP_PIN_AHCLKX: U; ^7 K0 G6 Q+ |: [
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */: z4 G6 G6 G$ e6 a, R& D
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR . t1 p1 [- C' E9 n
| MCASP_TX_CLKFAIL
$ ?5 I1 A7 y0 B* F| MCASP_TX_SYNCERROR3 e5 q% G* I$ u2 ~6 c# }0 {6 C+ n
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 2 o& m0 i5 N4 O
| MCASP_RX_CLKFAIL
4 d3 M( U. v; y| MCASP_RX_SYNCERROR + `/ H$ S$ w: a/ I
| MCASP_RX_OVERRUN);1 D5 j7 x) q7 W3 I" c( u
} static void I2SDataTxRxActivate(void)
! W. s" C/ S. t/ H, q{, M9 z& @$ @7 |% B
/* Start the clocks */8 |5 S& Z5 m* d
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);5 f3 B3 z1 b) ~4 j o4 ?
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */6 v0 `! | C: P, d4 O& O, v$ @
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
2 |, E2 T/ x8 ?% R8 B) K; d8 IEDMA3_TRIG_MODE_EVENT);
# `* M2 A) ]4 S+ x0 B6 t7 wEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
* l( `7 c3 f& I5 kEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */- d/ w; O& H' ~7 j/ m# W; R6 ]2 I
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);' d9 A+ A, y* k6 P* _1 R4 L
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
/ N% d4 ~6 \0 i% ?# F5 [! g$ l( h4 g) qwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
7 r. A3 T$ ~! q- d _McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
; }5 j( x" I. h( \8 B, L7 [McASPTxEnable(SOC_MCASP_0_CTRL_REGS);2 x3 M1 T2 F5 X5 e! Y" S
} 9 R* y0 P) }; K- n
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. - E' z: a x4 l$ q. t0 b7 y J
|