|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,5 @2 I) p5 T/ e: }# d+ [
input mcasp_ahclkx,( C4 |% }' B# q) A0 h- b* }3 ^
input mcasp_aclkx,3 y1 ?# I* p+ f' M3 M
input axr0,
, z2 O& o- z( X6 Y# m& k( N$ O4 k/ N
output mcasp_afsr,2 @% A. f5 q2 Q
output mcasp_ahclkr,
( k& _' { n9 noutput mcasp_aclkr,$ l2 X( I7 q/ ^% P9 A {
output axr1,
" S8 z$ P- D' b: I assign mcasp_afsr = mcasp_afsx;# a# o6 ?6 @: Q( B/ u, E
assign mcasp_aclkr = mcasp_aclkx;
( C- N# X3 \% E/ hassign mcasp_ahclkr = mcasp_ahclkx;; d( d5 y$ ]* B- U$ a
assign axr1 = axr0;
) M$ l( _" P8 {- Y2 x( u/ \0 n; i/ U1 S1 y8 j" k3 [
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
, Z% F( X3 ~7 u: a `static void McASPI2SConfigure(void)" k# a( ~5 E, Y0 S/ t1 l2 {! c- ?
{6 ]/ r+ H4 R \ q6 z9 |' e9 [/ {
McASPRxReset(SOC_MCASP_0_CTRL_REGS);; s( K5 ^6 D7 [- m
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer *// v- m% a* u6 X$ }9 k7 K
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);7 b& l! T" }# z: y- t
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
# g" i. ~4 N( R9 S' o/ ~, } CMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; ?: q4 ^' F, X' F+ }% R$ {; n
MCASP_RX_MODE_DMA);( a' j/ Z5 D9 L+ O6 o v9 {/ x+ Z
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 `! u5 {1 ]6 P+ ~ o" Z) |! ~2 P8 d
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
% D f+ g5 T/ T+ f( _McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
2 O8 s5 f; M, T+ w3 uMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);0 V; A( _& J" V3 ?# O( j/ l
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
* @4 d% }: `$ q. }/ B6 T8 h* yMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
8 i9 t5 C0 V) ~" I- qMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
" G7 T/ ~; B# e6 l( X" zMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
8 @$ H' W9 E& A8 v4 V. V% YMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,* [+ I+ p( X Y* R7 k- |
0x00, 0xFF); /* configure the clock for transmitter */3 `; M' R$ s6 ~2 v% M! j( D" E
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
, q8 S8 ~7 F- N) x/ IMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); , W& [+ b9 i. U
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,: _$ @! e7 O- K" z' j
0x00, 0xFF);' p7 R$ y- W4 P6 p5 @& U
7 W- E- }# L3 o' w
/* Enable synchronization of RX and TX sections */ ! ^+ x6 T+ o( k. C7 P4 f, t
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */9 C- A' i. G9 i- O+ q6 P
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
. Z% j6 B4 k( jMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*+ D8 N! x5 s# S( o1 C% q" w# N2 k( k
** Set the serializers, Currently only one serializer is set as% I. r1 b" b& z3 f% V( T' p
** transmitter and one serializer as receiver.
" ] ~; ^7 U* h/ h* g*/
! s) _; q# N6 k5 j1 S$ [/ f. }McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
+ y% ^& m" O6 N' ?* @5 Y1 | W% |McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
. M5 L/ Q) Y, I; |7 I0 M** Configure the McASP pins
0 S. i6 s8 j: q; Y; u8 ~! [** Input - Frame Sync, Clock and Serializer Rx
- B p6 a: J! g: K( U** Output - Serializer Tx is connected to the input of the codec 8 E' I; T3 q# O6 E& q j* @1 G
*/- P0 R! u% X7 I0 ~# k d# P
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
5 m B, f4 ^0 \* X& nMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
R. m% l( m# z" Y4 u, n& x) SMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
7 c, L4 ~, O5 L5 k$ C* f| MCASP_PIN_ACLKX/ |1 [$ D+ p7 y9 D
| MCASP_PIN_AHCLKX! x _3 A! C' e" G
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */5 Q, t6 k9 V, J1 w+ f; i3 \& j
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
# A$ D! e) |6 v8 J- f0 b| MCASP_TX_CLKFAIL * s. [) e' ?, F- _6 c8 o$ \% h
| MCASP_TX_SYNCERROR* ]( o* k6 l3 Y, n! s# _
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
) R0 E& W+ W- g! W: H, E+ b| MCASP_RX_CLKFAIL
# `. L$ \: W3 y8 c/ T$ k| MCASP_RX_SYNCERROR
% c/ s8 e6 M% O" \| MCASP_RX_OVERRUN);/ b0 C( f5 r- G0 H) u, f
} static void I2SDataTxRxActivate(void)
3 z" b! N: k! s# X{
) [4 Y* r1 d. C. U* o3 ~ y/* Start the clocks */1 j" q5 E: Q; b, b' X/ r ~
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);3 y+ v9 g# q0 U4 M a
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
2 L6 E' N9 x x' bEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
+ r( g% x7 N# ]9 xEDMA3_TRIG_MODE_EVENT);" K1 p: I# ~1 I4 X7 H. A
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 4 v/ V) T) t2 A* P$ X
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */5 a$ r- O. _0 ] u5 J6 y
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);" Y) d( u5 G K9 D
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
7 ~9 ~& u- E( L5 n5 T5 Swhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
$ y5 W# ?. d3 v+ {4 n! S$ GMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);6 R; E- c& `7 m7 Z. t. ]
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
6 j1 N8 l9 |1 Q x* I} ! p- h Z1 [' Z& [ g+ T: q
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ! `% `+ L q) X! j$ p; W& l3 D! r5 g
|