|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
" p- F- o4 e+ d+ W, rinput mcasp_ahclkx, }* _: O( ?4 o" K. R
input mcasp_aclkx,( B- l$ P: Y8 B) r" [3 P
input axr0,9 q* T* K: M% V1 z$ {# ^& N, S, C
1 D* M* }8 y1 R. A% }; boutput mcasp_afsr,; q# O: ]7 d( ], J. N( V$ w
output mcasp_ahclkr,; _, {2 f# S/ _( s
output mcasp_aclkr,4 n2 e2 d/ f* r& v4 s
output axr1,* A1 ^7 d5 ?2 F
assign mcasp_afsr = mcasp_afsx;$ a: V0 f; F y# U* f* j
assign mcasp_aclkr = mcasp_aclkx;
8 n# K$ b5 ]9 ~; g3 A: J% S# Uassign mcasp_ahclkr = mcasp_ahclkx;
$ Q7 \, v8 P3 d0 vassign axr1 = axr0; 6 T/ Y9 \( D+ A
$ m0 @- p* _% `* x* ]& t) H/ M- [在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
W* U5 F' D6 {7 |8 zstatic void McASPI2SConfigure(void)
3 d- w% @! _6 W D{3 u7 \) B! _) r7 H" \
McASPRxReset(SOC_MCASP_0_CTRL_REGS);7 g2 z Z8 i, ]2 K+ a
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */. ]4 v) ^- ~1 Y' e
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
4 H% g8 m5 V# M+ Z2 ?- ]* iMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
8 {# C/ F' g5 ?; e: W7 `7 TMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,7 V" K/ |# J( h+ k* h- i0 D$ M
MCASP_RX_MODE_DMA);; p3 a! J) \. R( I
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ T: Y; _- G: Q! l% x# k& b8 cMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */0 ^9 P) o( @8 ~4 l1 M
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, - X6 T6 g7 z# X5 U) u; Y" U
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
0 {7 Y3 G7 b+ z. l- IMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 2 `0 |. p' A( \) t9 b) Z. B
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
1 w @9 r! R( g+ Z6 CMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);8 [( `$ P; S0 f- K5 }
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
: J. L1 ~- j3 H# z& JMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
- _( P. i! I$ R' N0x00, 0xFF); /* configure the clock for transmitter */
6 K j" [7 P* ]. Y% s( b% ZMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
3 e1 ]/ B9 O' Q( o0 @: o3 j1 f4 aMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); % o" L a4 F. N3 w
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
$ T$ w+ `7 }+ o' C/ n' P, _5 @0x00, 0xFF);
$ R0 @/ e. ^: J$ ~6 l H6 m& t5 m
' p' L+ Y' D4 z. V/* Enable synchronization of RX and TX sections */ 5 I* e% T7 `. \7 c, B2 [
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
3 }: B8 W8 ~8 Z" r+ k9 C& DMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
1 M+ C) |) W0 Z7 B7 M. Z- C$ xMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
- t( u. x# w# t** Set the serializers, Currently only one serializer is set as
: p+ j4 a$ `0 C1 X+ k** transmitter and one serializer as receiver.4 |0 _! Q4 d% ^: Z; D0 o% W
*/
% W5 H9 v1 a- @: V6 [) z9 r+ ^McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
' k. H8 I( ]/ [McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*4 {2 F" ?2 l6 Q0 _! x
** Configure the McASP pins 6 D; `! W* V/ F1 r2 V) `% P# [
** Input - Frame Sync, Clock and Serializer Rx
; ^$ ~! \& P2 |5 }2 |. q3 S: j: g** Output - Serializer Tx is connected to the input of the codec 9 K$ p; n; ^, A& ~2 O
*/0 p. h. W& N1 m7 h) j7 n% G/ y
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);4 x! F" c+ K0 N3 Z
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
' m w% x+ d ~2 z/ BMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX: Y' M! c& i# F F# D9 l
| MCASP_PIN_ACLKX
p. @1 R( n9 L; d# D( d f| MCASP_PIN_AHCLKX- k3 Z, w/ c& n
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP *// j0 |- M3 [6 w$ N6 B
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
. n+ k3 z' [- m+ g0 i| MCASP_TX_CLKFAIL
7 M) g) {7 [) N3 ]) B| MCASP_TX_SYNCERROR
2 Q- [8 {9 I9 W d| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
3 @. B6 S7 C* S& r| MCASP_RX_CLKFAIL) M. b& H7 @2 l5 R% }
| MCASP_RX_SYNCERROR : A0 \% c7 {4 H. r$ x7 W$ l. s
| MCASP_RX_OVERRUN);
1 G/ J8 r9 Z, m} static void I2SDataTxRxActivate(void)
$ T7 L/ J& F# T4 }{
* b6 F Y4 Q& g. J6 {4 Z0 H/* Start the clocks */9 _/ p: k( @ V1 ^) C4 r( l* E* J
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);& W& \9 ^) _: J E
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
T+ K) Z5 U& `EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
, v9 y6 c- B* S( zEDMA3_TRIG_MODE_EVENT);. q5 |+ U8 o* l
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, : m7 g Y6 M/ C1 p, T
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */: a) E6 h2 [( W9 e0 O; R, f
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
' U) x s, J2 V \6 `: OMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
5 ]/ \8 B; d# e* ]! k' r- cwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
4 `! E9 v. W# k" Q8 {/ m) PMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
0 d& _ S# q( x5 _7 {9 y5 R* }McASPTxEnable(SOC_MCASP_0_CTRL_REGS);8 r" T6 B' a# }2 q
} $ _, s1 f1 r, Z# @. W# |
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 0 B( [! r- \- n) t @! V' l$ v# Z, I
|