|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
4 g- b& Y ]' cinput mcasp_ahclkx,
. L4 ?9 X) u( i5 @input mcasp_aclkx,: \9 e" m5 r% n
input axr0,
8 ]! G: M: @* m0 b1 [- ^
- \7 |% w& b' G; x, W) Y c0 h2 Doutput mcasp_afsr,
) Z9 U( a* W9 D* U( ?( B) f2 Koutput mcasp_ahclkr,: ^: F* {9 r: [* F, F
output mcasp_aclkr,
# F4 `% I/ Y/ E( [output axr1,0 ]9 k5 Z9 q& ~( @( M v
assign mcasp_afsr = mcasp_afsx;
3 K) B0 U( R$ A: C Bassign mcasp_aclkr = mcasp_aclkx;7 m/ @3 M) X* `* f/ Q$ \
assign mcasp_ahclkr = mcasp_ahclkx;: V$ L/ [; y. L. V. i( F: }7 |+ N( ~
assign axr1 = axr0; 7 d: o7 A" Z3 g
: a; A" \5 f1 C/ V- X在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 8 B' N. |7 |9 p
static void McASPI2SConfigure(void)2 h+ M o' q- X, K$ V3 e8 h
{
5 F7 s9 ^/ `, h( Y5 XMcASPRxReset(SOC_MCASP_0_CTRL_REGS);& j' ?0 y. i5 C F; Z& N0 X
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
8 x* q& K. z6 X' uMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);) A9 ~ N; T4 [, \: M* _3 b3 p% D
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */7 N5 O* g+ W+ b* X: Z
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,+ \( f3 q6 N: o4 ^
MCASP_RX_MODE_DMA);
% g/ v! b; k$ k+ G9 S+ N0 ^. tMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- U# h* Q. O' ]# I# ^: I, W- e! eMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */( ^/ p: z9 g# A. Z
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, - Z5 m! M* a9 l0 b8 P+ d
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
+ P/ }7 f& S% ^+ ~McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, * h$ n; l: N5 x% z& b
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */ t+ O% }4 R W$ C- `1 ?
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);" k! A* W* q! F) l) M$ F
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
" o& D8 B; x' cMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
8 |4 Y8 `/ L# W J9 P1 Q, c0x00, 0xFF); /* configure the clock for transmitter */( U9 N) i2 u1 {$ R( M% @7 t
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
5 p, s8 I, \, q; {# K1 `McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
- v/ k3 I* @! R/ a, MMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
. H$ Y4 _3 g* X- G5 Q7 m0x00, 0xFF);
4 J! Y2 a) \3 K. r( e2 a
, Q+ n* E& S. t" M8 `( S# [9 j1 [( _/* Enable synchronization of RX and TX sections */ 4 S5 g; f% u" n8 K% I
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
3 p8 ?/ j: h. ]2 s& I3 VMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);4 y; M3 Y/ A e" Z; F
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
2 d8 H' R, s0 H1 B0 }! a7 K+ l** Set the serializers, Currently only one serializer is set as
8 J6 R5 f1 ^$ o3 `1 j8 v) M, z** transmitter and one serializer as receiver.
/ t9 z# p: [, H* o: a5 `# t*/
4 m. \3 K; C! \7 N5 v6 EMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);& \ E' P B! a# `: u7 W
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
) a( \5 G* [: L. G+ y** Configure the McASP pins
D# u+ Q5 H2 ]/ n8 l* G, ~** Input - Frame Sync, Clock and Serializer Rx
6 A& V$ V6 A6 [6 N' Y) i# ^** Output - Serializer Tx is connected to the input of the codec
2 y6 j9 p/ l ?% N*/
* q! N0 V6 t) }McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);) F! b# h3 c* x- W% q
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));& L9 S: |6 ?. h$ W8 Z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
4 Y5 M H, o9 B g| MCASP_PIN_ACLKX
0 }, k- q! I, n, _| MCASP_PIN_AHCLKX
9 M$ I, Y, H/ u9 R| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
: O4 O* V2 h# K# }McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
% H5 B4 E+ B+ c| MCASP_TX_CLKFAIL , H0 ?' M$ H) R% R/ s+ P
| MCASP_TX_SYNCERROR
+ j" S) [& G$ |1 @| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 5 G: P$ n; {7 ]8 W7 a0 N
| MCASP_RX_CLKFAIL) P; z+ W* U! |* @
| MCASP_RX_SYNCERROR
3 p# ], l2 ^* n& I# \| MCASP_RX_OVERRUN);
b. P: T, u: C2 B8 V} static void I2SDataTxRxActivate(void)& w9 h' N8 Y" p, G! a* \
{
- v6 { k3 z" l. ]) B1 E5 j- x/* Start the clocks */
: i) s1 E& M& S7 ~& J1 AMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);: [: G: K/ m7 Q; l q
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
/ l: B0 E0 N( pEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
) ]/ T( M2 w8 O8 lEDMA3_TRIG_MODE_EVENT);
$ q. F" u3 H: L8 m' y, _EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
' o9 x( D7 w6 bEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
6 ~7 o. P# H+ b. T. H+ xMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);% j/ P+ T! _7 }3 w R
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */' g4 h' D8 p8 |; ]$ J* S0 v
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
8 c& I# H0 h" u& n4 x" h) ^) v2 @McASPRxEnable(SOC_MCASP_0_CTRL_REGS); N R4 a: ]5 D; z& U* G
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
& H2 i# f$ y; |) c}
! r1 u) v( I1 s请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
M( d4 {6 _- L) j( _ |