|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,3 K! o% [& I8 a; y( V; }! [
input mcasp_ahclkx,
3 S1 U3 k8 b( M9 J( w" u0 jinput mcasp_aclkx,+ ?- r9 r$ [: v# W( ^
input axr0,
. n1 W+ a: _" P) V, Q8 |1 M: N
# }$ w& X3 z) o: G+ X" C6 eoutput mcasp_afsr,
4 V# R ]1 g. d7 |# j9 loutput mcasp_ahclkr,
- [5 ^! p/ B/ G6 |output mcasp_aclkr,
Q: i9 \7 S& Q, J1 b0 noutput axr1,
$ ], Z2 x! {4 R# f: K7 U9 n assign mcasp_afsr = mcasp_afsx;) _$ W+ K0 C8 Y% M2 H
assign mcasp_aclkr = mcasp_aclkx;
0 U$ a# o- e. J( ~& \assign mcasp_ahclkr = mcasp_ahclkx; T, R% e- `5 `7 x
assign axr1 = axr0; & ]" O6 W3 @+ G
" M- E7 ]4 ^( O1 L. V
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
$ w1 l% x$ R1 E9 `static void McASPI2SConfigure(void)6 p Z! S$ J; U7 S; P1 G9 m1 N
{
1 D8 J8 B9 U+ _, \) G0 R7 ?1 Q2 jMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
. f; {7 y! I7 i8 Z0 tMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
2 m( T# \" R0 {McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
! J0 v. `0 t5 wMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */' L @7 p9 O' @9 j; S" q
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
m1 b( [5 `' {- |4 r! s, ZMCASP_RX_MODE_DMA);+ `6 v+ m+ {+ Q3 n
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, O6 Z0 t3 l( Z' w& ?! s$ ~8 c
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ d* G0 s8 |; \( Q, Q9 v
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, # ~+ B$ U; v% L9 }9 e- A' }, C
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
5 D4 A: M, }/ U* Z: b2 o( |& PMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 1 [+ H$ F! C5 w# Y5 C t
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
/ ]! J# \8 P: T- x& Z3 [/ ZMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);3 a1 g. P _1 h5 [& g
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ' ^' `5 l; {7 [3 X7 g l1 s
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,% X2 x$ D# ]8 N# E
0x00, 0xFF); /* configure the clock for transmitter */" L0 U. {, z* p4 W8 ~/ x5 J% [
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
9 _0 y4 E: Y1 K3 f, B7 i: i Y* NMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ! t3 S- M$ b- h
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,) u" ?% d0 @* h$ @- r6 [
0x00, 0xFF);
4 {& @* y# o3 O8 @/ j. N& m& z: m$ q( _1 r+ x& I' `
/* Enable synchronization of RX and TX sections */ 7 q+ `6 v( O# @, D2 |
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */) `5 o9 v" \# u }* X
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
& b# h# P/ b) O# K% [' yMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
2 c' |+ M, b7 N& S** Set the serializers, Currently only one serializer is set as5 H) s# f' K8 |; {
** transmitter and one serializer as receiver.
- K. f# q8 F4 _: }1 y*/
2 p9 G5 s' W2 ]2 qMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
; h' ^8 Z- E* k5 z# J8 ^McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*2 n' P" |8 b: C$ I# z0 z
** Configure the McASP pins + q4 N0 Z9 A0 H" |3 W! @, F% _
** Input - Frame Sync, Clock and Serializer Rx) S1 n- {! L" j2 D' {. v
** Output - Serializer Tx is connected to the input of the codec 1 M( f# @$ H# k% N
*// ^$ D, B6 z& w4 b
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);# f, C, W# z, S8 h6 a- p X" j
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
& I* X& g7 t0 r% W; [+ LMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX2 ]0 |9 n( p& V) o' R/ n
| MCASP_PIN_ACLKX
0 z# }9 I8 x6 z9 ? L' G| MCASP_PIN_AHCLKX
0 J6 i3 b+ Z' t/ J0 l( ~" G1 k& ^+ Y| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */( Z! H$ D3 S, ?
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
% Y+ K5 @7 k. N N) Q- M v" r' v| MCASP_TX_CLKFAIL - X- W, Q, {& z
| MCASP_TX_SYNCERROR* r) ^5 ^* i9 }' r* b- _
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 4 _+ l- z+ T1 R3 }) I2 ~
| MCASP_RX_CLKFAIL" H, @! i4 \, h% V
| MCASP_RX_SYNCERROR % ~) U o) p2 F/ u
| MCASP_RX_OVERRUN);
: A" K, Z5 ]9 v} static void I2SDataTxRxActivate(void)
% ]: g/ g3 a; l{$ z) U- l/ i8 T
/* Start the clocks */4 v4 x' {. m) j/ V6 l
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
^8 U/ ?6 F- L2 uMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
; o+ X E& V5 p3 S$ rEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,4 N$ j' @. c: P @' A* M8 G1 W
EDMA3_TRIG_MODE_EVENT);: j0 i$ v: J: B' P: v
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 9 a- c6 l$ E, }' O
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */5 r- X8 J3 _! |$ V3 R$ h& M
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
3 J4 C4 d% ?2 V, Z8 e* KMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */& }1 _7 ]/ `3 ^0 Z
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
4 `8 v3 @- ~: ]) m2 e. _& ?/ A! P5 xMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
' t8 ^2 P" _# u! u' _McASPTxEnable(SOC_MCASP_0_CTRL_REGS);% p4 K* j' T9 {. c0 f, [9 o
}
1 ]5 R7 A8 J9 c* z- J, r. P* j请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
% u* D) U N1 d7 ^ |