|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
* f. ^" M4 K2 o2 |# zinput mcasp_ahclkx,' E7 n, m6 y5 B+ ~- } `4 J2 h" W
input mcasp_aclkx,/ D4 E& P6 Z! d" j% K; I# x e
input axr0,
5 n) w% w0 i) v/ U# ~7 F7 V6 V/ P2 @" _2 {% T: l; b8 F6 {# P2 B
output mcasp_afsr,
$ O z% {$ R, Q" C9 youtput mcasp_ahclkr,; e1 G% a6 J5 Z5 `. G
output mcasp_aclkr,
0 q" n) m. K# d' _2 a1 p* \output axr1,! \; [+ b! S" j
assign mcasp_afsr = mcasp_afsx;( N Y( z+ R3 m$ B* F c$ l
assign mcasp_aclkr = mcasp_aclkx;: R: i- z4 ~; N
assign mcasp_ahclkr = mcasp_ahclkx;
9 E+ U$ ?8 c+ V5 P0 T9 I) l, |assign axr1 = axr0;
0 F2 N& S1 G# l2 i" H) B4 B G
" j% b. ]2 j8 s, F在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 3 Z* M$ D$ r% `7 z K! M3 R/ |
static void McASPI2SConfigure(void)
5 P( s I# [3 M; ^' `{7 Z: t; A- O# U2 ~
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
' C( y* ^( p% _" A. a1 }1 nMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
+ \* e' @' _& y8 l" c' |McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);5 B7 Y9 t3 }. \* q' l; ]
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */, R1 c Q' N, N, j3 Y
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& y1 w! g; t4 CMCASP_RX_MODE_DMA);) V/ C# D: J/ ?2 Y7 W
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
J. X/ j5 _8 [$ U+ q: u6 LMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */+ ] {% v8 B1 |" [
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
0 _( Q5 G- c: ?MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);. L5 c, M% c, R: l
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
h6 E f8 b# k/ E# `: h, o# s' FMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */6 w6 a: `: n0 v4 ~. r8 Z J
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);+ K% B0 s$ ^" A) {9 B
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); " E8 @$ l% g u7 C1 t5 T3 Z. K$ y
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
. H+ `: \1 w7 G9 L0x00, 0xFF); /* configure the clock for transmitter */
/ v, F, n/ u0 Y& Z5 H& B4 T% c3 YMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);. L1 ]! i$ j. s+ p
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
; h% s0 B5 ~' ?+ e5 [! J( {McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,/ G6 M) G6 y) H% K J: `
0x00, 0xFF);
@% @ e c0 i& X3 ~: u. ~0 L" Q$ }( z _: J
/* Enable synchronization of RX and TX sections */ 9 L2 q6 A5 l- W" N- r8 G) k( ^
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
4 n3 X& n! o# k' V9 q$ l# n/ oMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);) g }9 L5 |( M* H; j6 ?) `3 C
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
; | T- V% m5 R* V8 ]9 Y9 s** Set the serializers, Currently only one serializer is set as' h: D4 }5 }5 f# n# s. l" p: N
** transmitter and one serializer as receiver.2 _* s- f1 Y2 J2 _. d2 k0 H
*/9 r* _2 \8 |) H+ ~7 X" F
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);/ [0 W' k b! I
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*; d4 j9 s8 l: O! r, x4 I8 _) j
** Configure the McASP pins ! d; [$ Z; |. M7 x' |
** Input - Frame Sync, Clock and Serializer Rx0 Y9 j' L$ I2 P" r8 O9 E9 L1 g
** Output - Serializer Tx is connected to the input of the codec
# u8 a% n- R7 _& [" H- u*/5 h4 S2 y m. f5 B+ H
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);' Y7 D: ? I) {4 m$ H
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));0 a1 }: S; t- g
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
/ h& `+ D5 `7 b| MCASP_PIN_ACLKX3 n& i$ V9 m# l' n: w2 |5 n
| MCASP_PIN_AHCLKX
) s! E' T4 O; E; J| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */5 ]) x- C; n4 Y) T% k
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR % b) A3 `& g: B- ]: ]6 Z
| MCASP_TX_CLKFAIL 2 b( Z8 j' U8 d' R. s5 w3 s% @' k
| MCASP_TX_SYNCERROR
6 I6 z& w, M& ^| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR , C2 k* O# Z4 m
| MCASP_RX_CLKFAIL
7 O7 B1 M( ?/ _5 O( Q| MCASP_RX_SYNCERROR
# e8 z2 v5 ]- ^: l+ Y; p| MCASP_RX_OVERRUN);
3 { x& s/ |1 o- E+ w7 `} static void I2SDataTxRxActivate(void)& Y& z# y7 @% l. M
{2 q& v! }7 m- y, ^3 g& f" l
/* Start the clocks */" A- D5 h* E- o# C9 G, a
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);7 O" B+ ]- e M$ ?' `. ~0 J3 `
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */ y) V3 Q# X% q* i7 t$ X
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,8 [ c2 w( y7 p" {& v7 B
EDMA3_TRIG_MODE_EVENT);" T& h$ j! d& l, _" Q- k [
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
2 N" s" d& m; r) ]- |3 T2 kEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
1 k/ Y9 f/ d" a, N+ R7 c, LMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
% I/ D: x. s0 M0 t. ^: b+ `. R6 ^McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
2 [& v O, U! q d$ }. b% o. _- W) x- lwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
, z" U$ Z- T8 W. e' P' D YMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);( g" U6 w" P r
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
, D* q: X$ j8 _. w8 `. i}
+ M0 M% ~2 V1 X9 o; S/ ~请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
) q* P$ e# i5 p) h9 ]' f |