|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,/ E! Q7 U* _/ q" E6 e5 ~. S& K
input mcasp_ahclkx,6 \* p: B' Q A0 M+ |
input mcasp_aclkx,; V3 `/ ?3 R# Y! H! h' P
input axr0,
4 P4 Q$ K9 J6 w
: d1 O7 w+ L7 K' i) loutput mcasp_afsr,% u" \+ D$ V; b/ V2 g
output mcasp_ahclkr,
- C9 o8 n4 d5 e2 R8 N z" X( houtput mcasp_aclkr,, V% {4 E/ |! D, g: Z; V% a
output axr1,
, f& Q( ^- G* x& ` assign mcasp_afsr = mcasp_afsx;4 e: b) R6 a1 J6 k m+ ^
assign mcasp_aclkr = mcasp_aclkx;, X6 M& V9 S9 h+ N; N% K2 @
assign mcasp_ahclkr = mcasp_ahclkx;
( \5 e/ C0 z* u& U& W& I# eassign axr1 = axr0;
" f( \% d2 Q8 z) K+ s' h: {' B: {* k5 ?9 N: w- J& h8 @
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
: M( R! ^& b( K- Zstatic void McASPI2SConfigure(void)
3 W- U4 Z; W+ h- `9 [% G{/ @8 H: A6 V; J# D
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
% {% m) D0 q" f2 ?0 Z+ z p4 \3 eMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */$ o4 Y5 d/ @3 }- A* p
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
5 q7 P7 d/ \( x' r. uMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */ c( _& U9 q* l. r& e! n
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& U* H/ q8 h5 C8 a% TMCASP_RX_MODE_DMA);% Q* t0 M; G V9 _5 W
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& O2 q' G" z" k2 a% T" aMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */! `4 Q2 l% E) @: E# s8 V
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 5 m+ Q# Y4 j7 K2 M* E2 s
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);3 z: K0 c* j* I( |8 e
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& v a) i8 c/ P, l1 D9 MMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
2 E2 }" l+ a0 H) b1 \& v0 \McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);, R4 K& z- f2 h: g2 S @
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); " {( d+ s9 f$ }% m! i
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
. w, L* c; Y2 }/ a' T: `0x00, 0xFF); /* configure the clock for transmitter */
% ?" [9 K; `, R8 }8 @McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
0 p2 \$ ~; X, f: Q; l" N& tMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
/ v8 f4 s l9 z4 j% a( N. s/ `McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
0 G. d. M, @0 u6 X0x00, 0xFF);
# {: R( r% ^2 L& F4 _- H- ?' L0 e+ V2 q! Z
/* Enable synchronization of RX and TX sections */ + c; u; A" p; n# ]1 M) c9 \
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
* a5 s5 L- _8 [3 K1 J, P4 TMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
- h3 i! K% T# i( s7 O! ?McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
! I) {6 m* c5 R! b" l; ~5 S** Set the serializers, Currently only one serializer is set as% u$ y* c5 U9 Y. p% I
** transmitter and one serializer as receiver.
; N, S( E' F; j. f& I: V: q6 p*/
. l! N" X$ W3 [9 A6 T( ?6 cMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);1 ~ V' C( B; H: |$ k& [" Q# @9 H
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
2 N9 [0 ]& R* Y$ d3 G" q, c0 U0 c** Configure the McASP pins 0 _' p) M& R2 o4 @( o& z9 ]
** Input - Frame Sync, Clock and Serializer Rx
9 J$ j9 K' T5 S0 E2 b1 ^, P** Output - Serializer Tx is connected to the input of the codec
: p. ?4 u) ?, v) n7 ?# {7 [*/4 p m: B% t5 V ~: i8 p( F# W
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);7 ^+ n' q/ g! y6 E0 R
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));' L2 E; h9 e" Z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX- E9 V( e6 G- W( W& T
| MCASP_PIN_ACLKX
9 c# b( \- j! x| MCASP_PIN_AHCLKX- x4 \: t. P- ~) H2 u4 `
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */; n1 [1 \; b# h* _
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ; T$ d4 w1 C/ Q" ^- ?: ]/ K' }
| MCASP_TX_CLKFAIL 1 O+ K" K7 [% @" n0 s
| MCASP_TX_SYNCERROR
$ g8 b% M7 r6 n5 c+ q' P| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
; ]8 r# \. C a) t# s| MCASP_RX_CLKFAIL
; [% e" c2 ]9 e5 F1 \3 F9 p| MCASP_RX_SYNCERROR 1 Y) P; k8 f' |% z1 U5 Z/ K
| MCASP_RX_OVERRUN);. G% d9 y2 K- a
} static void I2SDataTxRxActivate(void)
) y+ r$ [3 P) |/ K{- y, G$ _- }% _4 c% s$ d
/* Start the clocks */4 p: m; l9 P9 A8 u. [4 H
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
! t7 w; P+ R% i& F/ ?( fMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
/ o9 q/ F( |7 b3 }0 @$ ^7 `EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,% H+ B8 f4 t8 H) \
EDMA3_TRIG_MODE_EVENT);
4 {1 {) @$ V, n+ P7 X bEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
6 @* g! Y6 C4 j+ [8 x4 Z' J; pEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */) f! N" q$ Y% |- j/ V. y
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
, a' M+ C. C, lMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */5 W+ m1 a6 E" O( ?. j' w2 o, q
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */* U y |2 P: c6 D
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
; D7 d5 u4 L7 P9 o4 UMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
9 V D; [9 ^3 A! }* w} / y1 s* g/ |$ z( H- L# n' V2 q& A, y
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ' V- L& z# W0 m6 D* S& g
|