|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,- s+ ~5 v; m) H8 s+ D
input mcasp_ahclkx,
; @, F# w0 B3 [3 E) m5 _input mcasp_aclkx,# y. k; q: n1 }5 ]0 _8 M
input axr0,
6 n d* J" n9 h8 g8 T
6 z6 F" {1 S. Doutput mcasp_afsr,6 ?* }+ n: }2 a9 T8 r
output mcasp_ahclkr,
9 H4 k# f- @# K# C% A1 Doutput mcasp_aclkr,6 |( l9 W% x- J' {! c) G' S, D8 c
output axr1,
/ L- t' I+ P$ ~2 B1 }2 R2 h6 z assign mcasp_afsr = mcasp_afsx;
2 }5 A E3 Q; g/ H4 e5 s7 s7 ~( kassign mcasp_aclkr = mcasp_aclkx;
' l( y) H5 n% G$ @2 F# g% a1 Massign mcasp_ahclkr = mcasp_ahclkx;6 f! m# D5 Z9 l, F! |
assign axr1 = axr0; 6 g! E! ]$ {6 {1 O2 w
. J" q- O1 A9 m; l) Q
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 % _# x7 r k0 D5 b3 U
static void McASPI2SConfigure(void)
+ |6 p3 l8 B0 Q' `- Q3 E" ~( e7 ?{
" g6 H) q4 \2 J' B0 M" \McASPRxReset(SOC_MCASP_0_CTRL_REGS);6 J5 H6 |+ W6 e# I+ I4 t( Z/ E8 h
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */$ Z6 n, I, e( N
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);" k; v' g, f+ D' F; b" r% U
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
' Z' k8 W+ w8 g& f# m' [, LMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 f" J! U$ \! a# o
MCASP_RX_MODE_DMA);
9 P6 N3 A1 @4 i( B* G) ]# h: XMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: S3 Z) @0 }- _5 n$ j" C
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */) u& I- N+ ^$ K# r# q& M- X9 o
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, . ]2 Z) d! I# }9 o7 c- ^
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);0 x! Z1 V' ~ r9 o# e& Z
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
6 j2 R6 \. j$ T4 ~: z7 _MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */+ \% Z p% m* v! u
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);4 e6 X9 w6 n8 G3 _* r6 _; Y5 ~
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); $ Q4 \0 k7 d/ P" n
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,& ?9 ^9 J+ g% z L. ?9 T
0x00, 0xFF); /* configure the clock for transmitter */
! q6 @8 m* a2 y0 @* ?+ z7 nMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
. |$ h! k4 X& @4 gMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 2 |7 w' l. n% L$ K G
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,8 A; ^% h6 I: e, P8 k4 g
0x00, 0xFF);
4 Q+ F: A( r1 R/ k; `% y% }: k! X9 f1 ^3 v
/* Enable synchronization of RX and TX sections */
) ~- F; U- M% L9 VMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
) p$ v! o8 U( u5 DMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
# ~5 K6 M u' ^. ?$ i. b, `0 H: `McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*" p+ p2 B* e1 a
** Set the serializers, Currently only one serializer is set as
+ a" a7 |6 P* M" Q K** transmitter and one serializer as receiver.
0 Y9 n M8 M" D" X, c7 ~*/8 e3 C$ [# d; _; n
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);9 Z% Z2 @7 M I
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
$ T* ^% A, W3 I2 W% `** Configure the McASP pins ; ^7 T$ K5 S% J0 f# }6 Z
** Input - Frame Sync, Clock and Serializer Rx
0 L: O* }8 ]$ w- f, D8 @** Output - Serializer Tx is connected to the input of the codec 2 \0 Q0 q, W" _8 N! H3 R
*/
% K, S" X2 U* @9 hMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);4 |2 a7 y* @! D
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));; E; `9 J* M5 F; f; y
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX. Q( i( x& F' P$ [( B3 c% ^/ D3 R
| MCASP_PIN_ACLKX9 T. R4 Q. \7 ^ I! ]; S
| MCASP_PIN_AHCLKX$ f; C' {0 u+ ]0 X7 o
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
9 {4 E* m: U6 d2 G# V* FMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ! d' {) L/ ?6 m0 ?9 D
| MCASP_TX_CLKFAIL
3 q$ J$ V; p) Z ^+ s' ?: ]6 `| MCASP_TX_SYNCERROR
. r4 F7 F3 }) K( A| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 2 N! P* X8 W1 d0 Q( }
| MCASP_RX_CLKFAIL9 b5 A. e) l* ]" y6 T% [- t7 J
| MCASP_RX_SYNCERROR
- u7 Y4 s% a% [/ f+ X4 }| MCASP_RX_OVERRUN);" A/ ^4 t/ q& v" h6 r
} static void I2SDataTxRxActivate(void)2 R- ]7 N: z* u3 {5 s7 \6 N
{2 }+ `$ \( A/ [4 p: ]
/* Start the clocks */& X: Y9 H" g+ P& }0 m- u
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
, v4 ?4 [* ~# p9 R( eMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */( J7 ~" [2 i8 p
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,( L* O( E" a$ v! L# w
EDMA3_TRIG_MODE_EVENT);9 \) U0 ?9 g; J" K6 X( J: @
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, g# f5 N n e: ?/ Y d z! R" H
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
3 K( }9 g, p$ a* HMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
% Q5 s3 I2 x, E0 x. ]! o. IMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
# E2 M- U* K, X" \while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
+ Z- {" d* e0 r. lMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);- [4 N; N9 P2 x4 z
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
b3 |9 W- ]: O# Z6 _}
7 |/ s/ s' ^7 X4 r- X4 x请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ' Z( W' e( `8 n, k; p! D) P+ y
|