|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,9 }1 V# _! ]: g
input mcasp_ahclkx,/ O4 y: T# z$ n
input mcasp_aclkx,2 L8 A/ p, H6 A7 c$ y, [
input axr0,* |: Y; q% X+ ^6 H. R9 k
1 o* |5 r5 l6 r$ Y6 X" \
output mcasp_afsr,0 D/ G1 j! b3 j8 y% F! ~7 E8 K
output mcasp_ahclkr,* ^, B' A2 @/ Z+ o4 `/ O
output mcasp_aclkr,2 a8 N4 e/ o$ K+ P" n
output axr1,0 `) E1 ^! [: J( @$ D1 s! g. e
assign mcasp_afsr = mcasp_afsx;9 E- O5 t q" t
assign mcasp_aclkr = mcasp_aclkx;
. i" H. k& ?0 W0 wassign mcasp_ahclkr = mcasp_ahclkx;8 I9 p c6 y; C* ^
assign axr1 = axr0; % i8 {* \) k/ `& Q. T
- z. k! B; w- m( k
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 , T) j+ @7 x( Z( h+ Q; I+ s
static void McASPI2SConfigure(void)/ f, S- a% r+ J) Y0 {- C
{ D, u: o; p7 I6 p# y
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
; A% k% e0 P6 WMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
9 a* X7 k0 i2 @4 ?' kMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);) l8 Y' r2 k, f$ ~* w; O% I( K' f
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */- R7 }' M) r: b1 O: }$ x
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& f5 s; p) v. e4 S; j( A( d6 [$ F
MCASP_RX_MODE_DMA);
1 B/ L* ~1 H' V1 F" FMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 _( A5 ~# U) }7 x) M' w/ }6 rMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */! N, j6 F8 t7 ]. n9 P* l- v" L
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, - J: l) D" d4 J+ ?" f
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
: s9 F9 z% |* M* S9 \" SMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, , q7 h3 b- M; ?: j. z
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
1 a! {8 \4 U* K' ]8 j FMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);6 p; D- k' A* e0 m
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
. a2 n) Y. i. D" s7 ^McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
# Z1 |' [# @3 i, Y" m0x00, 0xFF); /* configure the clock for transmitter */2 r. a# N. U* ]+ f, n) }6 u
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
' A: b: ~' { d# J3 k; BMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
1 g7 a4 {+ H4 A/ I6 C" |, OMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,3 ~5 c, L% M) V
0x00, 0xFF);$ I4 { e+ _; u5 H a3 B1 _2 ^
0 o# c9 M, {; ]* q% e, W4 `/* Enable synchronization of RX and TX sections */
& `+ O0 I$ `/ [3 O' d, y- tMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */( X# N6 a3 D1 L$ C
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
6 E. [9 @! `* ]/ Z ZMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
% ~; m& c2 S5 W( J; R; J3 I; `** Set the serializers, Currently only one serializer is set as
0 e4 v9 @7 q+ v3 p** transmitter and one serializer as receiver.
, }" ^% x$ G5 d3 c3 e' T*/% t% E/ h6 Y) L6 t7 r6 _
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
$ x1 [! X; l7 i4 D7 F9 }McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
" V$ _' L: f0 c6 ~4 y. ]' S** Configure the McASP pins 8 E" E0 h: m, ~' S- t4 p# ?
** Input - Frame Sync, Clock and Serializer Rx
$ z6 R3 V- l; |6 A+ B7 F3 q; X** Output - Serializer Tx is connected to the input of the codec ; _' c6 G' Y! B! T: X
*/
+ U1 x" d* u8 H1 e HMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
U" u( X' a* O5 A. dMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));; W- b$ o+ v5 h& B) m3 }( e
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX7 I# r, S* s2 c
| MCASP_PIN_ACLKX+ b9 P6 Y) M8 N
| MCASP_PIN_AHCLKX. Z3 ?* W3 a1 r+ t0 J) J& r
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */! r* [& k( g: b2 c% X! b9 A
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
3 c s6 }1 _1 ] t8 q% I| MCASP_TX_CLKFAIL - w: b6 ~) G7 S* _9 K
| MCASP_TX_SYNCERROR8 Z' p/ O0 \$ O2 Q4 p3 Z+ h5 |9 z
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
0 F9 r5 E% S( S% B9 ]/ ^| MCASP_RX_CLKFAIL% n0 y3 ?0 l5 T2 ?6 r) ?' Z' W
| MCASP_RX_SYNCERROR
) u6 f+ p9 t# Q| MCASP_RX_OVERRUN);
/ ]. r* b* C% ?- L G5 D5 E. g} static void I2SDataTxRxActivate(void)
) k! S3 k2 N/ E: W' g{1 u* O: c( D2 v( B# V
/* Start the clocks */
+ |5 H$ R- L# P3 T) f5 QMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
2 Q2 Z0 Y }, D- pMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */7 A# E( a5 k2 O+ T$ z/ P! M' _/ G
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,. n, ^7 M3 u, t g% {( V! m
EDMA3_TRIG_MODE_EVENT);( i. d4 B+ \) x. P8 M
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
. d, k) r& A1 I1 I a) D# M- z+ C+ z0 mEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
+ R7 B0 f, d# H2 ?$ JMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS); J8 S1 c, A( {9 [0 E$ ^
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
" ?" m- E6 m: c1 f4 u* Y7 \while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
; E0 o: ~- z4 }2 K |& fMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
- O0 E8 i/ ?- e4 fMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);% o* w0 ]% V# }& w/ e! |# ?
} 2 ?5 ~& t$ C: {* h4 i$ d' T
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
* V) J+ Y1 o8 p; k |