|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,- [* S9 V" X- U& y
input mcasp_ahclkx," _3 F( N$ d' u* q% `7 U
input mcasp_aclkx,
( R" w) p2 {" z( K* ~input axr0,
9 S' C9 g: n+ b, r! r8 h. \2 a, E8 P
! c) z( i' O7 u: \' V! n9 l: M# ^& Ioutput mcasp_afsr,
0 O6 [# n4 U5 M$ o7 l/ ]8 aoutput mcasp_ahclkr,
0 d8 _- @/ L& e# Q" Qoutput mcasp_aclkr,7 I0 @+ ~0 E; U" J
output axr1,
4 F/ _+ E' ~- t' r$ J0 P* D! | assign mcasp_afsr = mcasp_afsx;" I9 m; W3 o# O9 j1 U5 f5 q6 j
assign mcasp_aclkr = mcasp_aclkx;# s: n/ F7 b% i* {
assign mcasp_ahclkr = mcasp_ahclkx;, F* L7 f' A( \! w
assign axr1 = axr0; 5 q) T* B* A9 \' {# q( ?1 T
- _! N. @5 S3 X: _1 ]$ b+ J
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
6 p; q! B6 A( rstatic void McASPI2SConfigure(void); G! k/ I( M+ a6 {; r
{
9 ?# ~ U/ l; {7 zMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
7 [, U+ _) N& F2 `- S# l; o! QMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
& A- j0 y) P3 y8 U. u! v' Q' rMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
8 C* M, J2 t! u, d {1 \McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
) q4 ]( [ y/ d- zMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 U0 i& N; c7 ~) V" _8 X3 d
MCASP_RX_MODE_DMA);' u2 u- w6 D) e0 H
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE," y9 n- S/ D( s* |* t' Y
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
$ r! u' A) D v% H% a, |* p- v. eMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
% T: C, J `6 F9 D' ZMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
8 b. B7 A9 `+ d6 C% HMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, " o( ?) b7 c; r; x: M/ Y) n: Z) Q
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */% p5 d$ U/ W- o: k5 d f" t
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
( V+ m+ |9 q' r0 BMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); % g* ^& w5 e* x. H4 I% A" y; c& P
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,- P) t* ~; U: _. V" ~( I+ Q
0x00, 0xFF); /* configure the clock for transmitter */
. i2 E1 |- j) e- \0 B/ ]' ?McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);8 K0 z$ q7 R3 l4 }
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); % K. T2 G7 T+ i* X
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32," @( Y. }- X) c( z
0x00, 0xFF); R, c! C) p. q5 I$ S
5 N9 n; s! u7 i9 ^) V0 ?6 k
/* Enable synchronization of RX and TX sections */ ) x/ j# _: Y+ z! T: R8 |2 ]* l/ v
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
9 k0 }$ z7 Q* l8 l4 UMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
: d2 e; O5 ?# G0 {McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /** c7 [0 ?+ f) S9 |- u& J
** Set the serializers, Currently only one serializer is set as& b% K( I/ o$ p: s
** transmitter and one serializer as receiver.
; i/ L* w5 i) E4 Z4 p6 a4 J*/
9 Q5 r1 O$ m5 ^! z: G9 Y9 ~* T- X8 [McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
# O+ u, O. V3 x9 e, D. UMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /** v8 x, @7 L3 o& W7 `7 [; N1 j$ ]
** Configure the McASP pins
0 U4 `7 m6 v# L. Z** Input - Frame Sync, Clock and Serializer Rx
( ^" w) `; C% M" P6 O7 Q** Output - Serializer Tx is connected to the input of the codec
0 v+ c) U! v7 D*/( d: u+ k# s0 c0 w
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
1 ?0 i" F, a; S+ B" Y5 YMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
" t; |4 d: j K8 |/ s* R0 K1 R TMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX: J1 p: |; g5 o$ D9 H9 s& d5 O
| MCASP_PIN_ACLKX9 _) m& A9 e7 |+ y1 Q# t
| MCASP_PIN_AHCLKX
1 |) @4 O6 N7 S2 a! O' n| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
" E, c5 e' E' m6 G) a" pMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
! H. [6 t i5 O| MCASP_TX_CLKFAIL
* K& I+ `4 `& p( j+ M; `6 p7 m( r& ~& W' ]| MCASP_TX_SYNCERROR
7 S: \3 |5 \$ u$ W# J| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
+ ]6 L2 t3 k5 Z- l| MCASP_RX_CLKFAIL7 }, e8 R% `' Y" | b- ]
| MCASP_RX_SYNCERROR
9 i! v8 \- b4 q- v| MCASP_RX_OVERRUN);7 o. G- N/ Q7 t, |7 `
} static void I2SDataTxRxActivate(void)
+ B( P: s" M# L. [, k{
, p: z2 U, N5 w- \/* Start the clocks */
- x2 v T Q o! i7 G$ @McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
$ H+ l. L' N! i: RMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
) }2 O/ i. T9 `& |* S L! z. VEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
8 A z+ l" d% J% p. J. x# {EDMA3_TRIG_MODE_EVENT);( ~! K. H3 z& H1 l: G: f/ K4 X
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
" {/ x1 |, S% J8 N+ UEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
0 ]8 \- O" i3 M! k$ L$ DMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
: c3 {/ |1 ~2 K+ ~McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */- {0 {: p- i# E6 @* x1 @0 e
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
) B. T T+ u' Y5 w9 I6 x$ VMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
' Y2 S8 F6 F1 i# g0 NMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);% E3 \% ?6 ?5 A3 L x3 [
}
! o- B* X: j( Y {- _请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 3 @$ a0 q) K( P. b) Q
|