|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,9 N6 l, D& v/ E4 p( k
input mcasp_ahclkx,# H7 y# j/ f! Y$ F
input mcasp_aclkx,
/ M9 [+ p9 ]8 C7 m7 o! Binput axr0,
$ z1 W# T; h+ _$ X8 T& d. r6 n3 I4 h
output mcasp_afsr,* v. t4 x( E. a6 g
output mcasp_ahclkr,, W5 [ K7 b% d" B
output mcasp_aclkr,
, S! D) Y9 R1 r4 _4 p, {output axr1,
0 [) q) ^3 [! {. a0 N assign mcasp_afsr = mcasp_afsx;
) u# q) M' i4 x4 a+ W5 _( B! [assign mcasp_aclkr = mcasp_aclkx;9 X0 [/ q! \5 C8 ~0 J' T& n! j0 j, {
assign mcasp_ahclkr = mcasp_ahclkx;
' c/ G: r! u) xassign axr1 = axr0;
; l4 A; x. l2 J- ^- h! S
/ W# K8 O' ?5 B0 h' I; V在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 / U+ p0 E. U7 o7 b
static void McASPI2SConfigure(void)
- D2 C0 U3 |, d @{
: H% p7 [: m# r pMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
B1 X) ~% f/ d; n: O& y IMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
/ B& F) V/ Q' [* W! k+ U1 r" LMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);7 G; t/ [4 _% ]$ z* R
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */. O$ ~ J }( @9 M" m
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
u* ^3 e2 X5 s7 v8 z( oMCASP_RX_MODE_DMA);
5 _, z6 a- V& L/ C& |' Y) LMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 I* [; z$ |6 M; C9 N7 n
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */5 U5 c2 {7 Y" i9 u
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
6 ?# q9 n" @+ h J# o* [MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);. s- q- D5 m& }( v7 E6 l
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ) p A! o+ t4 w- K
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
. n7 g K2 o: M) ?; s& e! EMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);% {. H, |7 X O' [2 X
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
8 ^! D$ s1 f0 H6 L1 ^. P- f( k: PMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,9 I3 ?* g' K' R$ H8 ]3 a: \
0x00, 0xFF); /* configure the clock for transmitter */9 d* p( k b1 Q: |. {& d1 p' W
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);5 S P2 t9 O4 j' i
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 9 b* O3 h7 n6 k, Q
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
8 q$ w# c: h% d0x00, 0xFF);
8 o5 l- L/ O) ^: i0 B
0 y9 W7 p" b1 E/* Enable synchronization of RX and TX sections */ * o1 E% \* D9 ~/ u& t) N
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */" p. g; l* v4 u
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
- ^; A1 w* i. a) tMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*$ `) x/ K$ I; p c5 i+ U
** Set the serializers, Currently only one serializer is set as
6 o: S0 }: x6 l* l# Y7 V6 Z1 U5 m** transmitter and one serializer as receiver.2 f: f4 Z7 n; H
*/
" f* q2 I6 a/ L/ `2 ]0 \McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);4 ?: y Y" O: z# |9 k; c
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*1 ?2 F/ ^, ]0 i0 {6 R+ ?# i0 X
** Configure the McASP pins * ?& j+ W# w2 s$ e+ ~; a$ U
** Input - Frame Sync, Clock and Serializer Rx
/ ]- M4 R$ a; B7 j** Output - Serializer Tx is connected to the input of the codec
5 x! @+ p' f% N6 t*/6 v9 e4 E1 J7 M$ o( @4 V9 M
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);; T8 \' r; `* E. Z
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));& Y. C3 u) p5 n2 b* l
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
) d' w$ F7 L0 L5 f# I, x. f; Q. ^& I+ Z+ F| MCASP_PIN_ACLKX. _( Q: G9 ]- z4 P/ ?& z E- N
| MCASP_PIN_AHCLKX
* P# C! N. t& }| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
5 @: \& ~( |: G5 uMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
. A$ i. y2 h4 b# K( j* z. o0 v" O| MCASP_TX_CLKFAIL " W4 a" f- e9 t6 Y
| MCASP_TX_SYNCERROR
$ |6 g0 N, z6 I; t. T* X| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR * O [( I3 u! a0 K
| MCASP_RX_CLKFAIL* n9 |3 O9 F) N! ?8 e; ^/ z/ n
| MCASP_RX_SYNCERROR 3 F9 G6 k0 d: d+ y V+ r# K
| MCASP_RX_OVERRUN); e# R7 X" a- `1 Y# v2 w# \
} static void I2SDataTxRxActivate(void)
, e$ j% ?5 W G6 L; s: F$ b{
, ]/ w* C6 d" u3 {8 ?/* Start the clocks */5 Z. l9 {+ Z% L% t
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);9 T% B# G, y" X$ }) r$ C
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
% i+ E! q+ q ?EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
5 C+ |3 X f ?& ?3 z. FEDMA3_TRIG_MODE_EVENT);0 p" s: U, O4 A0 L
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
* \/ v# v5 b7 j8 U1 u# bEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */1 L: r/ I$ b1 O5 |/ q6 u: m- q
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
, J+ D" }/ _, g2 [& W' ^McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
# M" d% ^7 e) B1 }( s' mwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
3 H( a; i: k; ?9 WMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
: \) ], t# z, i) ^. ~McASPTxEnable(SOC_MCASP_0_CTRL_REGS);/ x) f0 i! U7 Q. b
}
/ n" U8 \$ i0 \. N请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. / n/ e& H8 ^1 J! d4 c
|