|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
+ d, i9 F' Q. \2 M" Sinput mcasp_ahclkx,& {1 Q" O! l2 M
input mcasp_aclkx,2 i& V7 w" K& O5 }# }& X* j* C
input axr0,1 u0 J# l9 r) l9 l# |
6 ]$ J: T; c" B( }: A4 i
output mcasp_afsr,
9 a( i, R6 X8 S! K$ ]% P; U4 coutput mcasp_ahclkr,
2 ]$ Z b0 ~3 \& ]) O6 _, Uoutput mcasp_aclkr,$ z* ?* k, t9 Q2 G
output axr1,
1 D/ z& }: l( K1 X# j assign mcasp_afsr = mcasp_afsx;9 t! B. @/ j; v$ A3 v7 t. n) t
assign mcasp_aclkr = mcasp_aclkx;
" T$ b2 p0 }! Nassign mcasp_ahclkr = mcasp_ahclkx;9 v& Z9 c( L( S" \$ q ?0 }9 C3 E3 ]2 N
assign axr1 = axr0;
1 j5 l: M% q% F5 v2 v. Y/ v5 H9 r/ S1 U( f/ n h8 y" W. u
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 " H/ u# q$ Z% U. a& h
static void McASPI2SConfigure(void)3 Y: M! ]$ f1 [' }" I
{
: V; J+ H# U: j" oMcASPRxReset(SOC_MCASP_0_CTRL_REGS);1 n- Z5 R: V' U
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */, f! u! S: l! Y
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);/ C( l6 P P9 [1 v0 `2 _( w
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */1 C& H |$ n9 ]8 m. G R) r) h9 P
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,+ ]" X+ s! j3 h$ I/ l2 A/ G( c
MCASP_RX_MODE_DMA);) R! \! Q7 h& F: F
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 J) m9 A$ O+ n/ g4 P2 `
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */) `8 h* c y% R, t0 b: D# Y, b: O
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, " Z, e) `& ]( |
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);' M/ K/ D5 H0 A2 j" @# d
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, . P( X; R- ]+ T" p' `" g
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
3 m" p+ C7 ~9 LMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
7 t. L9 m* X4 ~' r) U4 W+ ~# zMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
/ k& z: y; s0 z, J% c- U8 R# P2 mMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,6 n! c$ G% _9 [% r- X7 l
0x00, 0xFF); /* configure the clock for transmitter */
" m( t8 f& `. _( d3 ?McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);6 c; ?6 f" Q1 {3 R
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 7 T" y3 ?- { Z5 r3 C
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,4 K, b7 w% z/ R- }. F0 V
0x00, 0xFF);" L+ t' P$ M$ L; [/ u% q! m" a! {6 L) N
$ @9 @+ q1 Y; ]/* Enable synchronization of RX and TX sections */ \: i3 i. w q. Y) X
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */( O# C% o7 E+ c- ^) i1 ?9 D% c
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
3 w, D2 {9 f! f: z. FMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*- j& H( r3 |, y/ ~
** Set the serializers, Currently only one serializer is set as
. u/ L# y8 G7 v& W** transmitter and one serializer as receiver.
+ Q; [4 K3 P: Y! {6 |" C*/3 G8 a0 v% d# A! T# m% D
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
. u$ R' l1 s q ZMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
) C9 o4 G4 w* |& u: i: U2 q** Configure the McASP pins & Z- S6 E# b/ f6 d' s) K1 h; @ n# K
** Input - Frame Sync, Clock and Serializer Rx( S4 V% j9 h; L1 m. }
** Output - Serializer Tx is connected to the input of the codec . ^5 _6 R* ]9 }+ U: m1 U
*/
+ y, a d+ E6 b! C yMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
, d" ]. y( H. M0 n/ W3 ?8 @8 n3 kMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));$ F1 C% ~ n: E( h
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
. ~+ h( ~$ O/ f2 r+ h: ]$ l; k| MCASP_PIN_ACLKX- T* t0 e T# u) p5 Q& K, K" H
| MCASP_PIN_AHCLKX8 H' O2 I8 J2 A+ \& O( ` G
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */1 O0 |3 ?, |* ^: h; s
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR $ S; a: z# Y t9 E: w
| MCASP_TX_CLKFAIL : F2 J& q& P7 p) l9 T
| MCASP_TX_SYNCERROR
- y \& }5 e" T; O |3 |: U5 D8 k| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
8 i9 q, x, A* u7 d# ]* l. e9 Q| MCASP_RX_CLKFAIL
0 Y- ^$ h6 I& q( _& j5 z| MCASP_RX_SYNCERROR 9 m, D' ?, ~' X* R3 ^
| MCASP_RX_OVERRUN);$ ~; R1 b9 j0 z$ l9 c! ], G. ~
} static void I2SDataTxRxActivate(void) O @/ S+ o( `4 s9 q
{5 n1 E: p5 q6 C
/* Start the clocks */
; Q7 @% j& p1 P' B. R! s' @, d5 lMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);0 s8 i; [5 a; D
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
1 m* A2 N2 V5 K3 [3 P" k' _EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,9 e+ j |8 {9 W* s5 |6 `9 C
EDMA3_TRIG_MODE_EVENT);1 O* Y z$ f, j
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ; T" h5 A5 [! b- h
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
* Q! r& P* v1 c: D2 `7 pMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
7 X) e) U4 R. H- ~McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
2 _" ^# P- N5 F" r, ~. j4 N0 Fwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
. d) J- r5 Z2 X) B4 rMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);" V0 g8 \ K( |0 ?! P
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
: u# a$ P; S, v; r6 ~} ) x/ J S2 h/ x: n G
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. , J, E' l0 j0 n* d: B; }' L
|