|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
5 p- H; B! a5 \( q5 X# Xinput mcasp_ahclkx,# ^. s* [, |; J' c4 N! i4 |- m
input mcasp_aclkx,- x$ x1 ?- @' O5 f! y
input axr0,
" a2 {7 U0 l% d$ Q6 R" p
: U5 V$ _, K) B) ^8 \9 poutput mcasp_afsr,1 c/ {9 h+ b% {, I
output mcasp_ahclkr,
7 p; ]! D* g0 M' _output mcasp_aclkr,
. v/ U; N2 @* g2 J: o3 Xoutput axr1,! N3 @/ O* K! L8 t* z# q' M
assign mcasp_afsr = mcasp_afsx;% f* u: @3 k1 y
assign mcasp_aclkr = mcasp_aclkx;& m; d- h1 W( H; Y
assign mcasp_ahclkr = mcasp_ahclkx;! a# t* E$ ] U3 F3 [# \3 Y8 q
assign axr1 = axr0;
$ G: n4 `- X6 Z9 D# p! ]
4 @3 e) t x( D在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
6 i2 Y" u( Y: Z; L; ^$ H2 z% k1 Jstatic void McASPI2SConfigure(void)
( F, @" W4 ? Y1 r" G; t0 @! Q{7 E5 `) L( k6 K( t1 f" O" y8 n5 a
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
: v+ {& D4 k7 W+ L7 Z- r9 n- aMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */: g5 T4 \. B# _& t$ L
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
% E. d. Z+ F8 l/ i" E6 \McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */6 J* k: R" {- d) G
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% J( w j! ~9 A; J9 c( HMCASP_RX_MODE_DMA);6 R4 {% p( Z' A3 i; r) ~
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 D% \6 `$ O HMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
7 m W1 j5 Y4 W( \9 V/ `2 pMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
% ?2 d! G& j- x) v( LMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
/ K8 U ?: [, w7 rMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ! J. ?3 R2 b$ g; V/ H0 I5 I( c& w
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */! k& [7 N( L& }7 _7 f
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
6 b# g/ M- }) P5 \- |4 [# Q8 aMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); , ~" o0 Z$ W4 q
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32, @* [) B' c' }
0x00, 0xFF); /* configure the clock for transmitter */
" C0 o# e' R. s0 Q+ W& h0 W- eMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);) ^ n P5 ^: D4 o+ I _
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
$ C6 s5 T' X: O2 B/ OMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,, \! X7 e' r: e) N
0x00, 0xFF);$ D0 L) Y8 W9 U1 ?* ]0 K1 X
+ s1 ?) [' U5 ]( X( ?2 M# e/* Enable synchronization of RX and TX sections */
0 F1 s5 v, d1 @8 J# kMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
8 z) X+ F5 ?: q! IMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);0 k3 V! a0 v1 \7 t
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /* J1 b# W6 P% y
** Set the serializers, Currently only one serializer is set as
0 ^' m: l! s4 D; I** transmitter and one serializer as receiver.
3 l' {2 [# j9 l0 w' m5 A# s*/
! p3 ^+ [/ U0 D# @McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
+ v- r% `0 D4 r3 D+ c/ b+ h4 WMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*) `, R, q5 D2 E r0 y& z( z7 V
** Configure the McASP pins
( T2 }& r4 B8 s2 P: i* H0 V** Input - Frame Sync, Clock and Serializer Rx
% Z) d( w/ K. [5 t& v% v f** Output - Serializer Tx is connected to the input of the codec " r& O1 N/ v# b" l9 G
*/) K- m; S' B6 D a
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);; r) T7 |9 {( W& n- _! @
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
. k- [) [; j8 s3 U pMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
3 t0 Q2 F I3 q+ J: T$ F| MCASP_PIN_ACLKX8 C; l2 X1 \! l$ m* U6 C/ x, Q
| MCASP_PIN_AHCLKX1 [0 @; f9 L1 R- K& m0 E/ n; a' g
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
1 l e; h0 W, n/ s! HMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ) _$ i+ [* y1 l- ~
| MCASP_TX_CLKFAIL
k6 C, j, n/ Q/ Y- E: T( ^| MCASP_TX_SYNCERROR5 L3 k2 M, U7 O% k6 f1 H$ X
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
, Q3 I! x; h$ V+ m| MCASP_RX_CLKFAIL1 H1 f/ R& q4 j8 o' S
| MCASP_RX_SYNCERROR ( f! @: ?, e' l" ^* ~% T
| MCASP_RX_OVERRUN);
6 u8 S! d6 N6 `1 ?4 D$ ~8 F} static void I2SDataTxRxActivate(void)# m" Z, D1 Z- [& |
{
9 T$ L: R, a* |# T6 v) o/* Start the clocks */4 Y* \1 w! Q# s8 _0 L
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
- @( L7 d7 s( ~: L4 N* Q$ i- ZMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
4 B. t `- f3 e* yEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,) Q/ o. N b% y4 F* _
EDMA3_TRIG_MODE_EVENT); H z$ R8 v+ H. S: h
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, $ R) r z2 W- F- n# L4 a4 b# S
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
t8 e! s+ R* R7 KMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
) _& |5 m( `) }/ A* g- V( X+ z) jMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */+ x }( U2 z2 i \
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
+ ]* B" h- h$ B7 ~McASPRxEnable(SOC_MCASP_0_CTRL_REGS);0 F! J; s* z/ j; A2 V' f6 s7 c
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);) X/ [5 m6 X" R h( ~
}
& M0 x5 F$ E0 V, x3 K请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
. ]: h s) B0 V1 y: z0 N; X" y |