|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
8 `: I g/ o4 x3 C+ Yinput mcasp_ahclkx,
, U4 o" P" t& ], |0 ~ m Linput mcasp_aclkx,* w& D8 W' l9 g, r Y
input axr0,
: `% a3 ~2 }- K* z" _/ n
- x8 }2 d1 c) l. n3 F: N4 p' X1 poutput mcasp_afsr,% o/ _, ^& [' u- c6 a# }; k1 \
output mcasp_ahclkr,( I* ?( F S6 z; ~
output mcasp_aclkr,
* u: G- |- G2 c+ i+ W) M- I7 voutput axr1,
# e2 G! Y% a4 O l! I5 U% ? assign mcasp_afsr = mcasp_afsx;9 I4 \/ P2 s/ {" `% ^
assign mcasp_aclkr = mcasp_aclkx;
, O9 a3 U% N; a7 W0 }, fassign mcasp_ahclkr = mcasp_ahclkx;
, B+ |& B" W1 c- g2 ~4 t1 ]6 Sassign axr1 = axr0; 9 S! L5 r1 O Z$ T3 z! O( c
. f" i. }0 A7 t. N
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
4 _: G1 p. S- l$ K+ z- q) pstatic void McASPI2SConfigure(void)0 v* H, X- Y1 E6 g4 o& Q. F
{+ H# E8 \0 l* w1 M/ D5 a1 r+ O
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
5 \$ ]& h" X ~3 N, ~McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */ g+ U G1 S1 C& J
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
( f* P" k1 b, [* G- |McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */+ B2 x1 t. F2 J( S' s6 f
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ @2 ~+ I8 g i5 E0 Q3 T7 E7 k& ZMCASP_RX_MODE_DMA);
, P! }0 v! {/ ^$ f4 fMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,8 l+ h0 j0 F' ?& b3 n4 o7 W# f
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */0 W6 |' P! \3 w B: W- x# ^
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
@( }/ g+ T8 X, jMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);2 F$ V5 E* ^ X1 j9 ^( o, a e
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ( f5 S }& f; D" J6 K4 @* O* F
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
+ T) e; N) O* h4 \# U; R, Y, h2 yMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
1 A* O' @5 m5 mMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); $ [& T3 P# e ~# r+ x$ x [3 n T
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32, C* O$ z2 z; W1 D% t/ Z: h( n
0x00, 0xFF); /* configure the clock for transmitter */
. U* J! M# E, q: ?& ~McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);. J5 U& o' f$ P9 q$ v L- ?; C
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); . x" s* Y' }0 f+ G. K! b
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,. ^) I% Y6 Q( h# V
0x00, 0xFF);
( V: {. r) {- G$ X* ?. K" o$ K+ N! j& {
3 e' ~/ R8 E6 U. I' B/* Enable synchronization of RX and TX sections */ 8 a& G2 l8 Q c1 L0 s/ J( C5 n
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */5 A+ f+ z$ o' U3 w5 y# m1 r
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);# l3 C9 j1 e8 T6 m Y. P# ^8 u
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*% P$ }' W8 f' b) e7 h0 \5 q4 }0 h3 P
** Set the serializers, Currently only one serializer is set as
# W: S( ^# W& o+ F8 m/ X** transmitter and one serializer as receiver.
! A8 W5 x, U; z' B4 I+ K, x; R*/
& {5 ^2 y* J3 Y7 GMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
1 m6 J* L, \ D9 f, qMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
0 _9 g2 ^' C$ |: S# h** Configure the McASP pins
' @: [1 R J) \** Input - Frame Sync, Clock and Serializer Rx
% @* m5 U1 E; h6 x$ F** Output - Serializer Tx is connected to the input of the codec % |. c0 `: v4 C$ a
*/
. I, h, C" J5 N6 q* b4 rMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
5 d; r* d' X4 B3 a# xMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));' T% R4 W& _' i
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX C" q. C4 J2 F2 D+ W# C& n. n
| MCASP_PIN_ACLKX% A* S+ B% M. o1 K2 p G' a
| MCASP_PIN_AHCLKX
+ `/ n& ^& e! L$ X| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
2 q2 x) B/ w, u- S" ~McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
5 |) X9 I" b9 w( a| MCASP_TX_CLKFAIL
. c( A: D" h) {- J0 c' d, m! m. p+ [| MCASP_TX_SYNCERROR% X( A& K ~% [: z8 }% J7 b1 R
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
- o6 p6 d0 F+ S( t7 B/ i# y| MCASP_RX_CLKFAIL# z7 [1 w4 d( U; I7 d C( u- h
| MCASP_RX_SYNCERROR 7 l" P' `& l0 N* @4 ~$ z
| MCASP_RX_OVERRUN);
. W3 R+ `; k3 ^8 l/ I' l3 I9 d: i} static void I2SDataTxRxActivate(void). J& f+ K5 \' F. `# i6 s! G
{
3 E; D6 C' @0 H& ^8 l/* Start the clocks */
% A1 ^4 J3 q9 s, n0 _5 W( hMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);$ ]0 Y7 a# n! _+ i% K8 D4 b8 P8 o2 U
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
7 y: ~! \8 q0 o7 DEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
6 |$ @0 n* K6 s5 Q& tEDMA3_TRIG_MODE_EVENT);
# o, X. o) a' iEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ! U6 s3 E- o V9 C7 u, {
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */7 b" l6 W$ a' _' T1 L5 s
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);2 u8 T* @0 r, ?# z H) N
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */2 m2 U8 k3 V, e! {3 ~6 ?" T) X
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */6 W+ c) N" ?& U9 D* x1 ]
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);/ M4 O0 Z' k6 F' u8 A! s& K B4 _) L" ~
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
# r* T, G+ o! p( P; O} 4 ]6 h8 O; q' B/ V; W5 Z/ L2 ?1 \
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. " |. b7 G' }( b$ O, E+ C' i) R, \
|