|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,- R9 I! g; M: W$ u2 a& y- E
input mcasp_ahclkx,8 Z# d2 W; h) k, c$ W! C. s
input mcasp_aclkx,1 x8 ?8 ~, p8 v6 {
input axr0,0 R$ `6 o9 f% C
; b$ D* T5 Q# @2 n' Toutput mcasp_afsr,
: _, \- x2 ~+ M, Eoutput mcasp_ahclkr,+ S$ @: H7 M4 L, `% R7 c0 C Q
output mcasp_aclkr,
, K' }1 D9 P* D3 Q6 M) Joutput axr1,
6 B) l1 R! ~# g' z0 t* B assign mcasp_afsr = mcasp_afsx;
4 g+ |/ Q9 W" J3 v$ P% gassign mcasp_aclkr = mcasp_aclkx;
$ M2 ~' L0 e; ]( e* _0 o) kassign mcasp_ahclkr = mcasp_ahclkx;
6 d' W6 F) \) ~/ L8 ~7 O1 P, t' Qassign axr1 = axr0;
6 E( A4 G% m/ f4 c0 }, j/ `( r& }9 D7 M' P
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 0 t! E3 q% m2 j. g `% d' f
static void McASPI2SConfigure(void)' q: P8 Q- ~) D1 a
{$ m/ F/ U# V. a) b3 c' ?8 h: z' V
McASPRxReset(SOC_MCASP_0_CTRL_REGS);& p A ?+ ~2 \ C8 N7 }0 `
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
3 i- o; J% }/ Z! {- j* cMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
+ F2 k( e) }: R8 p, M/ UMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
) i+ c; N& l. Y, {McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,4 `6 d7 l+ x( U/ d) ?9 G
MCASP_RX_MODE_DMA);! c- w4 P" }$ N) P3 y/ e2 r
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 _1 ?) l( |3 `* I
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
% l4 w( t [9 a N3 B: V* ^McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
. V: Y. O# C: Z _MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);, m( y& B4 W2 G% R& u5 P) ] i
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, & @( r& N! n4 [* A% D: p+ ~
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
" O1 \! x/ x( R/ B! {: _, yMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
' o# Y* W1 n, S8 b/ }9 lMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
& N" W3 V4 p! \" A! J+ Y* ~McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,8 [2 Y8 O8 ~, y% s! c c9 K2 m4 e
0x00, 0xFF); /* configure the clock for transmitter */7 m9 P3 @ c5 w' }7 `; p, n5 I' W- I
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);' M: D0 \4 i q8 {; [. r
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
' A4 ^& q8 E$ t$ b6 C7 @McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
/ x/ R5 k2 Q; I& _& x9 y; C0x00, 0xFF);+ ^8 W3 ]( b4 G7 r3 P
6 [/ O o: b' ^0 G$ z/* Enable synchronization of RX and TX sections */
9 g3 {& l5 | NMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */6 G1 i; O( D4 w n6 \1 H
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
5 p+ M4 g# a) n% N9 T) r- V& k0 bMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
3 z, _( s% H, \* j** Set the serializers, Currently only one serializer is set as% A# ~! x( _+ f8 Z% I6 g" g" F: h
** transmitter and one serializer as receiver.
! Q1 X' N5 q, B- t* V* |0 V*/. |' g' Z f1 C" P5 U; K+ T
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);. `/ u( D+ [6 i: H
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
$ V/ @& P* Y ^# C* f7 |1 O** Configure the McASP pins - H* p8 G2 y. J( q
** Input - Frame Sync, Clock and Serializer Rx E1 `( V$ a4 p/ Y0 j
** Output - Serializer Tx is connected to the input of the codec
l2 h" c+ | j+ L2 b9 Q# U*/
! V* S/ c, \! ^5 l3 L7 k- cMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);" p6 u1 N7 y3 ]# ^% d* H4 H C
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
3 ~+ {4 D8 D) M# x- F8 ~ eMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX& W l* Y6 |2 U5 L
| MCASP_PIN_ACLKX
2 H4 z0 ~9 R2 x. `+ h# @" j: _| MCASP_PIN_AHCLKX
: T# h* Y& B" U3 H! N# n| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
7 K0 x8 n* J, F& X4 X; E tMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
) B+ t0 ^* P5 q, I# \| MCASP_TX_CLKFAIL K7 {9 p0 M6 r+ W+ ` Z
| MCASP_TX_SYNCERROR) ]) e" \' r: R1 D% r# F" e- N
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 3 g/ U! Y' k7 c5 Y | J
| MCASP_RX_CLKFAIL
h' F2 C3 F; X; m5 O| MCASP_RX_SYNCERROR 4 f0 h/ {; K n2 r1 j
| MCASP_RX_OVERRUN);
' \4 |4 S! R) o0 X: X2 }+ z! @} static void I2SDataTxRxActivate(void)
8 \$ c# T% Q5 T& s9 ^2 U4 ^{
) `. {5 O) ^ ^3 _4 ]# |7 T* N/* Start the clocks */
& w4 R/ G* O0 b" g9 T! OMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
- s2 \: O/ T7 d: vMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */* T0 Z9 c# e3 u0 |6 C2 H0 x* `
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,( X. l/ Y M( W
EDMA3_TRIG_MODE_EVENT); s. N+ H" v; \' a( g3 F+ N2 ^
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 3 ^8 p1 \% x" {
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
% e; i: N# D5 J3 W4 I6 Y$ \McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
9 _/ J% X) t1 e. M" w* RMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
2 \5 z, g9 l4 | _* \2 F0 ^8 Cwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
7 ]6 }- e3 A! O- ^& fMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);" f' _ _3 l, j
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);4 }4 X2 M m/ O! k) A
}
; p2 B& A4 s4 L. R( e$ {- L/ K请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
! I/ ~, T9 z) ~! }/ A7 `6 \ |