|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,$ C( ?; I: `" q1 }' I) a) w/ n
input mcasp_ahclkx,
: `' C/ W) o* C- [7 i* a3 C; a% y4 Linput mcasp_aclkx,( P1 n% C& e$ y1 }
input axr0,
- T- \$ p/ p% m3 H! {# V9 b0 z- a- w9 N7 F, P/ P5 k
output mcasp_afsr,; N; h3 x! C* G
output mcasp_ahclkr,3 m3 Y+ a5 e$ |2 [" m
output mcasp_aclkr,
8 h. f3 E4 R Q9 Woutput axr1,$ [5 x0 c# p# {
assign mcasp_afsr = mcasp_afsx;
( `5 \" @. N3 e0 Z* zassign mcasp_aclkr = mcasp_aclkx;. H) x, f; p0 o0 U
assign mcasp_ahclkr = mcasp_ahclkx;0 |0 y2 x; H% Y8 k( `! N' B0 o% `& U
assign axr1 = axr0; - U' B( n2 U5 o2 V0 D/ M3 r
: O7 y* A2 ?# }$ T
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 7 X6 {/ V1 m7 q# P
static void McASPI2SConfigure(void)
' `$ c6 y8 ^7 f; e{+ v1 u$ Q V2 |9 o f; V& t9 ?
McASPRxReset(SOC_MCASP_0_CTRL_REGS);8 g, f% F/ N/ i' q/ E- E% w
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */& I7 ]; M. [8 ^ x
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
' z! U. g8 I0 rMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */2 B1 _2 s# y9 x4 r
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
' a) C5 y6 X, H6 n# v! W# _MCASP_RX_MODE_DMA);
9 w8 I5 N/ ?$ i$ w; a! C* K; fMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# G) h% N! U( X0 O$ eMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */. L/ X4 q$ N( Z/ E, }
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
; s* x) J: c0 ?5 n; O+ G$ }2 ?MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);1 b3 @6 d7 W0 [" s
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
* k8 X$ l4 T4 p% {9 t4 \MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
! b9 r) |2 h9 e7 i/ ]0 c5 L2 s! X+ SMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
' q9 F/ f/ P7 ]% Z6 f3 S0 B2 vMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
& n- p5 [) I9 G# [6 @; V) qMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
8 D% q: H' r2 m6 B0x00, 0xFF); /* configure the clock for transmitter */
9 k. _8 s5 D7 m0 BMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
; P! s- o5 e& l$ B5 X6 x# M+ O# GMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
! m' ^0 _ W5 YMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,4 f) o3 D& C( |
0x00, 0xFF);
2 k$ h" Z- c; D( J
! i! Y4 ~+ g! d7 K, n/* Enable synchronization of RX and TX sections */
4 u: y* h8 O2 S4 \, i2 N: gMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
) v1 U6 M: ?4 g; x3 B! c+ `McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
# x% n9 p4 j- s; _$ ]/ _6 z, IMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*: c! Q, y4 _: ^* f( K3 j* z# c
** Set the serializers, Currently only one serializer is set as
|( y2 \" Q8 E6 S2 @4 `** transmitter and one serializer as receiver.
! ~6 k) c& X* b*/
3 b( h: l- s, UMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);+ Y2 F+ c, J4 O3 ]% d8 a- v
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*! F% ]1 H' ~) A* g9 {, d/ G7 a8 x0 m
** Configure the McASP pins 2 d: H: H0 E- ] h: |2 I
** Input - Frame Sync, Clock and Serializer Rx
: p! ?; _+ A& M3 p** Output - Serializer Tx is connected to the input of the codec
; {' }6 {3 M( k* u*/
" m# @6 h/ |, J l ?5 Y7 f$ cMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);$ u7 t8 ? E) R9 l
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
% F, `! |- e8 oMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
3 @ X }6 T1 Z4 S8 ]| MCASP_PIN_ACLKX
6 l- ?4 _" t/ C: M" d| MCASP_PIN_AHCLKX
P3 ]) o' I# j7 d: r8 o| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */- \- y" W& @9 y, o- V
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
$ ], p- `* H: ?* U| MCASP_TX_CLKFAIL 4 q# k3 Q1 t6 B
| MCASP_TX_SYNCERROR* a: t6 z" H" i x- g$ _4 n
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR : g' J6 d/ G- F r* w8 }) `4 K
| MCASP_RX_CLKFAIL
# T- u- ~6 D# v7 n2 B9 g4 K& Z| MCASP_RX_SYNCERROR : U4 T; v- }) D" h, `3 R8 r
| MCASP_RX_OVERRUN);( s* }: p9 m' q) a9 _, f+ C; @
} static void I2SDataTxRxActivate(void)5 e( P: B& ~2 a# I
{
4 K+ ]4 {( V- r% B1 l# O. g/* Start the clocks */
# ?' N5 F$ O- ^5 b: f5 @3 _McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);4 u6 ~8 r* v7 D, ^ Y% R! p
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */0 X, d9 C3 Y: b0 H1 P7 Q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
+ Z* p ^: t; ^0 L5 zEDMA3_TRIG_MODE_EVENT);
# y0 y, y+ T" s! j2 [( A- ZEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 7 u* z2 [, ~- X2 x1 C9 P
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
) C; p) `+ ]) [1 ` f1 rMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);6 b) m2 M l7 G: O9 Y
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
+ [0 @9 R% s8 o& W9 {while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
# P6 r, ^8 q# O" \+ YMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);5 F; }5 q3 N0 e8 a; _+ r* ~
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);* e, q9 H0 ^/ _* }! c
} & l0 ~; s* l3 z( z
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 0 ^! f5 a. G" ]2 v4 N% s
|