|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,9 m8 Z* Y2 n; U1 d
input mcasp_ahclkx,
+ i" T' z! V3 N% m) Einput mcasp_aclkx,
3 K/ N0 ?8 \6 G6 h0 \! h- }input axr0,
% {; Y. g: F( l, }
m( I$ x& a p$ \5 R. [" Coutput mcasp_afsr,
# n. J" ?5 y; n# i1 s Eoutput mcasp_ahclkr,9 @4 z0 C, G1 k. ^% O
output mcasp_aclkr,/ {" l8 g" T* h! u e
output axr1,8 e' K, P- _! s
assign mcasp_afsr = mcasp_afsx;/ e6 l3 L8 s) {0 S9 D: B( H: R
assign mcasp_aclkr = mcasp_aclkx;
' l" S/ \) F/ r. s- p' uassign mcasp_ahclkr = mcasp_ahclkx;6 _. o9 Y( A6 K% [2 t9 L4 c
assign axr1 = axr0;
4 [: P M. e$ T/ R x1 |6 |4 O1 ?0 c: ~, u+ i
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ' \: h7 q* W" |5 O- } V; {
static void McASPI2SConfigure(void)
: j, E+ J; c9 k7 e* `; @{
0 `. w8 A4 m1 j8 jMcASPRxReset(SOC_MCASP_0_CTRL_REGS);; ~, Y$ T0 o1 D2 e4 d% E
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */5 @6 C, S4 p8 D
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
3 p3 H' S: K9 Y, d, _+ y! oMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */( _# x5 y- ?4 F- I; ?# E; L) U
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,$ \% D* u1 E; L* M
MCASP_RX_MODE_DMA);
+ r e5 N) x# T4 p$ NMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, G+ [' D/ K! Q# T7 n, P
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ ~) {2 Q- K- P9 l
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
4 G: [% X* Z: _6 b5 u# v+ ZMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);! s2 H9 N, G) b- h) h s6 ?
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
8 u+ d( i& L# j" x" KMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
3 ` Y/ a0 q+ E/ x# U' lMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
' d4 l1 ^" [1 I; r5 O0 xMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
8 u, K$ `7 t6 t$ fMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
" L6 Z; k3 m+ a% X* E3 L0 J" K+ {0x00, 0xFF); /* configure the clock for transmitter */
' J/ n% U# P8 kMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
: c6 u4 S5 E; }McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ' }7 R7 ^9 e1 [5 o; f1 Y
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
" V+ v5 ^) E$ K& Y0x00, 0xFF);. \* s# O- N6 R; W' G3 C
3 u" N0 o$ w- g( f! E S Y
/* Enable synchronization of RX and TX sections */ - a+ h [ C9 u( m. e% A1 v( j
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */4 m5 a# D, V$ N0 Y3 Q9 a
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);& D- Z* g5 B. d6 I
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*7 I$ @% z4 A9 }
** Set the serializers, Currently only one serializer is set as
, s v9 T) Y& w( M9 n3 a** transmitter and one serializer as receiver.
6 Y9 b, o: n. @2 @3 d5 N*/
1 }* y" _* N$ P' x& rMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);+ s" k2 i# F. d8 f3 ]
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
, }( `6 }3 V: H Y/ F** Configure the McASP pins 9 r! E; W, c+ @/ p# i' J
** Input - Frame Sync, Clock and Serializer Rx
) `( T9 m3 y( w+ c* W3 }7 j** Output - Serializer Tx is connected to the input of the codec
! i* V' m4 l3 M1 P3 k% |+ X*/
0 f+ k0 k( e/ w- _0 U( ~# ^McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
6 L+ E- T8 L! o+ h) {. `McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));9 H" C/ q# U. d2 Z1 h l, q8 Z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX- W7 s; P$ W- X7 A4 i* m
| MCASP_PIN_ACLKX% D( _5 u- i" @3 M. @
| MCASP_PIN_AHCLKX
! y8 C* @( s* ?| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
0 \; F& [! Q* A* q$ s" s4 z; EMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR - ]0 k; C' a3 u- |1 ?
| MCASP_TX_CLKFAIL
& }! I% ^( x9 h) O| MCASP_TX_SYNCERROR3 @0 u& p+ J# n8 u1 m
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 0 w9 S2 E O' B
| MCASP_RX_CLKFAIL- }7 n/ `/ R$ G: ]4 b) ~. |8 T3 `
| MCASP_RX_SYNCERROR # Z. c& |8 u/ M
| MCASP_RX_OVERRUN);1 @; j0 P0 v, D n1 M4 p
} static void I2SDataTxRxActivate(void)
1 l, S0 @) g) B! O1 Z{
& {' t, G2 G: R3 ?& e/* Start the clocks */
- L+ u) D1 V$ f1 L PMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);" m& _# `$ H& G6 F: [
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
' B5 k5 J* N" |" x8 QEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,* L; M9 d8 o7 ~$ D
EDMA3_TRIG_MODE_EVENT);1 c: m' v1 K0 m- C" v3 o
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, " ], H% f7 S2 }! d, m8 v
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */, n0 o8 g5 r9 q) h9 N9 E
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
z/ {2 P$ g ?* j5 gMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */# w; l5 j" H# W0 ]3 l
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
8 T( f/ `. i. i1 hMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
+ T7 T- T- \6 K7 l4 kMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);4 h0 `8 N6 r% S- m
}
" N. A2 h& @: f% y请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 3 b8 L5 r% @& q8 ]9 H+ t9 C# {% O* _
|