|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
4 q9 u( I$ \+ H+ iinput mcasp_ahclkx, w! f+ N3 l; u a1 v6 Y
input mcasp_aclkx,
' }/ |$ g3 a9 C% j9 }input axr0,/ t% v" E* E1 s( t
K1 r/ r. R) d, B5 _( o! \' U
output mcasp_afsr,% I! w( v2 \" Q6 d0 l0 W& l& X/ J
output mcasp_ahclkr,
/ w# E+ F! `2 moutput mcasp_aclkr,& Q) A( e7 f. @7 n* |0 M9 K6 V
output axr1,
8 i, c* C7 s: B2 a% P0 m assign mcasp_afsr = mcasp_afsx;
* w* x" r# D; S; @# vassign mcasp_aclkr = mcasp_aclkx;1 b% y) Q6 b y. J) z
assign mcasp_ahclkr = mcasp_ahclkx;
6 _4 u0 @! i3 G) Kassign axr1 = axr0;
: f( Q8 A. s3 w; I" q9 D8 t! c# W. v, ^" W
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ) A' C4 r5 d' J% A8 P! j/ P
static void McASPI2SConfigure(void)' f' U- f6 C1 J# R! K
{3 y6 w# S/ P! h$ i( v
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
" _; ]: |# Y% P4 z0 O- ?McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
6 J) [, e0 J: I l j! h( [' n' GMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);9 K+ d6 E; D/ ~
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */; S3 A' F4 v1 s, {% {+ {
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE, h8 h( h0 W+ e- x
MCASP_RX_MODE_DMA);
( }; s# s; q0 ?1 |! QMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) ~) ^1 s. F( S! v; g; J
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
: C# R5 N% y8 h: N3 wMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
) y b. a5 K1 Z9 V* c% tMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);3 l1 w! W: F. W3 X$ C' [8 N# N
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
D$ z$ r! o4 t8 kMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */! l/ N' C4 K# x
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
: g* L6 \. S& Q9 x1 J! L. iMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); % |) o7 L5 k8 D; H' L) d/ a
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,. M6 ]$ t- Z% w% D$ O+ |
0x00, 0xFF); /* configure the clock for transmitter */& R# P8 r% i, m, M
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);0 b& I& o0 H8 U! I
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
$ y! ]( ^9 ?' `McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,) @ Q" Q: N# J/ D# n
0x00, 0xFF);
! G7 ]$ B' K) A# a4 l& Y
0 t4 H/ ? ^% y/* Enable synchronization of RX and TX sections */ 9 U \5 Y' ~& C0 j: j9 V3 Q
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
- W* p1 ?- }; J$ d M7 `7 ]McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);. Z6 O7 k& t( V/ y0 K
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*$ H7 _9 K/ |$ p& F/ r Z; i
** Set the serializers, Currently only one serializer is set as
6 \! k# @9 @) z** transmitter and one serializer as receiver.6 S6 `0 K" p6 t+ }! u% c
*/
, G( ?, U* S# @ _* Z% {6 LMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
, A! M1 l/ F) q _: MMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
- u* C6 j0 n( z' j4 Q: d** Configure the McASP pins 1 k( _ k: T% j( r. ]( p
** Input - Frame Sync, Clock and Serializer Rx- s% ~! p8 \' V1 D
** Output - Serializer Tx is connected to the input of the codec
% y' l C8 t5 P$ ^*/+ g' V; Z) K* [$ `& X1 b* ]
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
6 t7 l4 ?( \! B$ V$ l" b5 yMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));1 ]3 c O V1 W% b' Y6 o
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX5 x! `- \ M/ Q7 t, k9 D# N' k
| MCASP_PIN_ACLKX+ V5 _+ j6 y1 w$ V; q9 ~" H1 `
| MCASP_PIN_AHCLKX
e$ D; M4 o. B& e% q| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
V3 z; ^6 S" aMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 3 ^2 o, W3 V" K. }
| MCASP_TX_CLKFAIL
: a' G5 W/ k- ?/ s: T( k| MCASP_TX_SYNCERROR( U( c2 U0 q& |4 }
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 3 W: z1 X/ r* s g1 ^) d
| MCASP_RX_CLKFAIL6 w8 X8 a: l4 L: O$ g A, T
| MCASP_RX_SYNCERROR
, p# ^4 p) k" ~) L8 s| MCASP_RX_OVERRUN);
8 K. ^: t; E+ A6 W) P" ^} static void I2SDataTxRxActivate(void)5 y( D5 \' n$ `& q6 i( {$ n2 f
{- b4 d+ M* Z' N, K- |1 S
/* Start the clocks */! F6 k# n# [1 o& G; y" C
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);% q% |2 E8 X2 z3 u. R3 t
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */9 H: D# [: S D7 _, C, p
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,5 N7 k: d' P2 o1 M% t
EDMA3_TRIG_MODE_EVENT);
4 h" H' }+ `, E0 lEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, : D1 j; k+ g" G) F4 n- N
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */ z' a0 w; W# Q0 t( P1 E, n
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);7 g# m/ S* \' J# R0 p+ v
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
) A7 s4 }: s, A! W. [while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */; c% f* d$ \0 J* m5 ^. D
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);4 g0 C$ o% B4 n0 ]. `' W
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
+ j3 p. r& a6 k# C6 [- V}
& y0 r. i9 P! r) j$ q" E请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
5 S$ V2 [5 M. E( F1 r |