|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,- g6 v1 I; k0 h
input mcasp_ahclkx,7 q: M% H1 D) j8 R0 Y
input mcasp_aclkx,
# P- M4 S2 q+ ]: B linput axr0,
. i/ w: k" M9 d; Z P5 r& R( g6 o3 G O, j& i. ^5 d% A
output mcasp_afsr,
/ ?6 ~9 I0 Q6 t( G/ T Xoutput mcasp_ahclkr,
M* T" h& y w, @output mcasp_aclkr,
2 L6 ^2 |+ p4 ?* q" t4 i' D- q; Foutput axr1,
3 C+ \+ a4 p- ?! x/ f assign mcasp_afsr = mcasp_afsx;8 J- M s* E8 O4 W" _
assign mcasp_aclkr = mcasp_aclkx;; F. C& a s! K1 Y
assign mcasp_ahclkr = mcasp_ahclkx;/ b2 Q* B" @3 u4 c, W* ?( i2 P
assign axr1 = axr0; , F( R5 q6 Q0 U0 b& _$ v6 u8 p
# f+ |1 G: @( y) I! z4 O1 y
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 - w9 k6 x1 x! h! D8 r: v
static void McASPI2SConfigure(void)
) X1 Q+ X& Z/ k8 |0 u1 H; g{
% Z/ V+ T8 I/ W8 U3 k9 sMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
* P1 D4 M3 M4 tMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */" e: v6 i1 d; }2 }
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);+ x7 b/ Y [. [, `2 d
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */: u6 {' n/ v; W) W+ s
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 h) V+ [9 K5 L& r* G- a
MCASP_RX_MODE_DMA);! e) ]4 B+ w% E/ T* W
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) i- `4 Q# y3 L5 W0 {% \1 j
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
/ o L. `+ u) g4 aMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, / y: i) q+ {( S7 L$ J
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
/ t, r$ H: l7 Y- a: ~, eMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, I2 h# z0 }8 H0 @, @* S* W9 @
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */; }8 R1 B, C" E. ]( ?5 F
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);: q, q6 A2 p X+ c% \+ P# d! G
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ! m% f! Y8 ~$ v2 I3 x) W
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,- y) Z9 k( r1 g& |' X
0x00, 0xFF); /* configure the clock for transmitter */( {- }; l) R9 u+ V% R) r; ^4 k
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);/ M, Y& f9 E1 n
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); % s6 u; ?6 h* B! T
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
* h, v! u/ U5 D1 ^, F4 `0x00, 0xFF);
4 ?: n6 V' W: `/ |1 y
1 |2 v# o: e: q5 p6 ]8 z% d/* Enable synchronization of RX and TX sections */
6 t' G+ h8 W: N/ ^3 pMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
! k$ E% d! ~1 [- c# z" _ g! ^McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);9 U7 P5 S+ r0 A& \8 w: ~( Y* q9 M
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*) T- a0 H5 e7 I
** Set the serializers, Currently only one serializer is set as. D' }7 G* V! e. K( N
** transmitter and one serializer as receiver.0 y& U# j4 B4 ?2 _2 P: F3 q
*/: D" [5 k9 G. c2 ?) l6 Q
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);' \; {7 a* z$ y( C
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
$ n( p& k1 |/ ~6 T L** Configure the McASP pins 8 \( h5 J% o! y3 S* a6 J
** Input - Frame Sync, Clock and Serializer Rx
$ S" {" ?/ o8 w5 s, D; B** Output - Serializer Tx is connected to the input of the codec # \8 T2 J. T# f
*/5 a) l: M5 B, G+ l& h/ l
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
' s" u) v$ P4 p- A! @2 d1 ?3 yMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));- @0 |: x) p/ l
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
A+ |3 c7 L% o: t2 b7 M( O| MCASP_PIN_ACLKX
( M, L1 l1 _* q( S; O| MCASP_PIN_AHCLKX
; H" ~4 _# z, q7 P. j0 d| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
6 x, H) r& q% F0 I1 _, V. `6 GMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
7 Y* a& n. x/ V8 o4 }$ V| MCASP_TX_CLKFAIL 5 T2 n# I; O- q7 k/ @8 F. l
| MCASP_TX_SYNCERROR: _3 _# x, B1 @/ c6 N
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
$ z; o3 T0 U- @: B$ y- X! i5 I| MCASP_RX_CLKFAIL
' y/ }: ^; Y5 \" X| MCASP_RX_SYNCERROR ; P) [1 h$ S2 q- Q% x) `- `
| MCASP_RX_OVERRUN);$ O8 t* ?8 X( {* K1 \. X
} static void I2SDataTxRxActivate(void)1 `, Q- n* z1 L! j* h
{) A# V: G& ^* E/ D9 J( Z U
/* Start the clocks */9 t2 @1 b& M) C+ ~1 n( H5 w6 T
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);( ^) N, Q) k: q, J$ r4 }$ N
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */, ~/ l- ]. o* o
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX, W. r1 Q) b! l% ~4 |/ s
EDMA3_TRIG_MODE_EVENT);- N! i1 _8 p- G5 O$ W+ w6 O5 T
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
7 f# B0 |' p, l% r' d" oEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
5 b! X; m$ J! `8 b' C2 y' RMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);1 J$ I9 X% d; _* l% d4 W- O. i
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */) w2 \7 m- f: k, N
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
) S# j2 Y. i% A, ]8 |& U9 u: O' dMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);& U' o, y/ E; ^8 c5 ]% q+ D
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);% |- C$ v0 j2 |0 K& W' b: c
} ) U; A& f* k2 u! V2 P8 {
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 8 c9 E/ `. Q" L0 t
|