|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,9 n- {& h# r# k" l
input mcasp_ahclkx,- Z% c+ y; ?% B4 x( j
input mcasp_aclkx,
2 C( h/ Q; r( J7 ~( }! Y& @input axr0,
) B3 }9 Q8 U5 k. k+ Y
# |% ^9 K* w) I9 N/ x1 ?output mcasp_afsr,
" Q4 S, [, p% q% t4 i- Routput mcasp_ahclkr,% b, p! m L* \7 e7 }% A. p
output mcasp_aclkr,
- v$ R5 R# t0 _$ {. @; u. Y8 Soutput axr1,2 c9 Z: y. Q, Y$ B' H2 B6 N; k; S
assign mcasp_afsr = mcasp_afsx;+ t7 A6 x8 `$ H* ^) M; `2 ?
assign mcasp_aclkr = mcasp_aclkx;( r# c+ s) s7 @* U& R- i; F) ~
assign mcasp_ahclkr = mcasp_ahclkx;" {9 @5 c4 {# a7 W8 s$ o
assign axr1 = axr0; ! y$ D" _8 i% [4 z' s
: O6 T* k% a) R+ y( D0 Y
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 " r- k) A+ Z, ?+ O$ c N
static void McASPI2SConfigure(void)
0 H' j2 S5 o; Z8 [{
" [# a) p% q; Y0 AMcASPRxReset(SOC_MCASP_0_CTRL_REGS);0 T6 C: T, {6 k7 m
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
) A9 l" \( z: d( _- W! SMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
2 `: c1 Q* [$ _2 a5 k- eMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
6 G& ?) w4 k" l8 U0 y0 U X' ]McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) \1 h5 Y- J6 E0 N# ]MCASP_RX_MODE_DMA);, u0 e- S1 Q/ o5 P P
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 c4 @1 n# b/ {, j% Y
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
8 ^8 s2 }0 W4 }, B8 wMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, & V6 D1 g; I* ^, y; C
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);, a4 v2 v" R" D2 \' _/ l+ J2 I
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
' _% K4 z. B+ K/ w3 d4 WMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */" Z% Z0 L1 E6 l# f2 r4 k
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);1 C2 _1 N8 O0 X) F
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 9 J$ c& ^ c( n3 f9 p% ^- q
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,! J$ i# a9 [; a- `- g' w
0x00, 0xFF); /* configure the clock for transmitter */
6 y* y0 J! N# b7 |McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);2 n, v! U5 j5 F- E( t! s0 i0 z
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 0 m' E1 n3 s( F/ M
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,# w' {' S$ a9 q) N5 p
0x00, 0xFF);) m3 Y i# Z: |) {) l( I) i
9 R( R5 D* V+ ?: l6 v1 I
/* Enable synchronization of RX and TX sections */
, X; K. c: X1 zMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
2 l' T! k4 e& S& r% b: v+ wMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);9 W& \& e4 F/ G# f/ F d- V7 i
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*, E6 l) N9 w0 H$ H K
** Set the serializers, Currently only one serializer is set as7 g D8 H8 s w* h0 |/ y1 I
** transmitter and one serializer as receiver.
! D9 {7 l* R! }2 l3 ?2 y( o# H- i*/
$ r% @' n7 ^: NMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);. [) U# x* l$ Q# i8 }8 J
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*, s, L \. X3 W$ F( m1 `
** Configure the McASP pins
: U* `8 K0 {* m& b( E/ m* p* m* t** Input - Frame Sync, Clock and Serializer Rx
& z* a% f& E% g, Z5 [3 t' M1 P** Output - Serializer Tx is connected to the input of the codec
! f2 H! G1 g8 J& r7 S5 g! N# f& T1 j*/) v1 u+ v% Z, j
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);/ l7 ~- F5 _$ s, U* @
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));+ Q0 H. P' j( ?4 q( n
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX& S( H% ?# _. |( S# _
| MCASP_PIN_ACLKX' z# F! P4 a. U. ~! Q8 J
| MCASP_PIN_AHCLKX& K8 ]' \6 m& n
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
9 ~: G% D* h% S2 ]4 [4 t) tMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ) a# T7 A Z' @# V# `8 m: ]) J
| MCASP_TX_CLKFAIL
7 H6 v$ q, O i5 ]5 y( H| MCASP_TX_SYNCERROR
$ b! _5 }* X- ~# D| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
9 [; l& q8 R3 M. I$ n0 ?2 e4 c% Z| MCASP_RX_CLKFAIL
5 p3 N) `( Z2 u% _- X) c0 s! F| MCASP_RX_SYNCERROR * o* K6 V5 y1 M' `0 `: I8 W
| MCASP_RX_OVERRUN);. H! _2 c6 [ ]& ?
} static void I2SDataTxRxActivate(void)7 b0 P9 \- ^7 A( q4 B
{$ h% z0 u& K4 D8 W* P- l8 `
/* Start the clocks */
: r; f: ?1 r1 L" g8 w+ |, x. P, UMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);' A1 K6 y/ l; |) C- @ F" q1 T
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
* _3 M' r. @* N/ `+ sEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,8 @: ~) [4 a( _
EDMA3_TRIG_MODE_EVENT);
$ a# x W8 [# \! U- z) u6 D* ZEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
1 l+ F3 \. A ~EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
2 y Q& X: \; t' ]! c% @McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
+ r" d; w. B, N* ?& EMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */* D3 A; S, z/ t* _
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */- T) D, C- j4 q5 Y& _
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);5 X! w" L+ O" T1 i* `
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);5 W( }1 U1 B; K: G
} ) U/ d: ^+ e& F5 \
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 8 B) [8 C7 l3 O# i
|