|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,3 P7 {3 k4 j; b/ o9 \( `! O J0 Z
input mcasp_ahclkx,3 b& K7 Q7 p# p, M
input mcasp_aclkx,* v/ l! d0 Y& a/ h( ?
input axr0,
4 |6 [' E. Q$ [9 d, @, _8 v
* V- x3 v+ c" }# Coutput mcasp_afsr,* r, d! v% A8 S+ [/ K' z0 E
output mcasp_ahclkr,
' w, L, X3 t5 U* s7 Uoutput mcasp_aclkr,- N6 P6 e% c1 [- ~
output axr1,
$ A% \( M! ], g5 o6 [ assign mcasp_afsr = mcasp_afsx;! c4 @" c5 f8 B# \* a
assign mcasp_aclkr = mcasp_aclkx;
5 t" G) A% I; |assign mcasp_ahclkr = mcasp_ahclkx;
) B1 i. t2 n7 r, N+ Y! Massign axr1 = axr0;
/ Y! L7 e2 P4 Q k T8 k0 b% s
6 D1 w8 K. {3 ?1 x在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 : _' T' J9 B' O& F+ Z6 G
static void McASPI2SConfigure(void) L; E" {) o/ r, Y9 b8 o# q# H" o
{
7 C! k8 y& \; ?McASPRxReset(SOC_MCASP_0_CTRL_REGS);* K, @! c; k8 F* i$ r
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */& o9 ~6 F- H r1 A3 @
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);. l B* m# l1 i* u8 X4 m
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */$ M0 j& p+ k" Y8 G' m8 M1 t! J% M
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( I4 ]! w0 Y/ Y0 A. E
MCASP_RX_MODE_DMA);* V7 v0 T; ^5 U5 k3 p/ _1 h
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ r5 ~( e; g4 b# [# zMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
& g2 w) ? H0 T2 M/ BMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
% K% G% n1 F4 u# \$ O- @) J7 lMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
& d M5 a4 T$ Z1 r5 n& L# ~McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
2 P3 E6 q) U- aMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
0 p2 K7 ~' E2 k3 K5 p0 Q \McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);- Z! ?( g% D: s) Z v" x, [
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
# p8 @. S/ N+ w- K7 S0 nMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
8 _/ e% ]- z. f' S0x00, 0xFF); /* configure the clock for transmitter */
9 G- |# S# z& m/ z- V. G% dMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
: @+ V/ w( W. R" \1 `) ^McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
* j1 @, n( X; S ]9 F6 ~* r* V \McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32, D/ L9 f3 H: i7 S) k& B
0x00, 0xFF);9 l/ U( K0 C. g/ g) G' |
3 N9 H6 Y$ x! {+ g* x' Q* L
/* Enable synchronization of RX and TX sections */
- G) ]+ n/ {/ L: O- ~# d/ AMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */+ T- T; \- z, z5 ?& K! _6 q; m
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);$ Q8 N2 B4 ?! n7 ?* A7 |9 m
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*- H' `; V: P$ h# ~, _1 Q3 ^
** Set the serializers, Currently only one serializer is set as
% J* f+ L1 ~4 I M+ M$ G' Z: X& Q! J** transmitter and one serializer as receiver.
7 n; N7 S6 @$ |9 x$ x*/
4 }# K8 U" F& fMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
' q2 D# P8 R! S/ w8 s$ u1 T# I4 IMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
4 i$ F9 R! ?# Q* b2 y** Configure the McASP pins
% Z. ]/ F+ V1 O; [** Input - Frame Sync, Clock and Serializer Rx) H3 [: y8 i9 G3 Q" e6 s3 ?
** Output - Serializer Tx is connected to the input of the codec ! e$ p: O6 w `% w9 z0 n
*/3 ^5 q1 `. t! @& b& D8 t
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);# c& V& O9 O6 r4 b& O- J+ H. w& d
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));: a* O/ B& Q$ X( ]0 y7 |
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX; R# j) B; h6 O
| MCASP_PIN_ACLKX3 Q! `# @7 a1 K& P4 g
| MCASP_PIN_AHCLKX# u: `8 J1 M! Q: \
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
8 _4 I: @" K8 P# C1 y% S G* \5 b! ^McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
/ b6 V8 f5 O+ G9 G9 N| MCASP_TX_CLKFAIL ) K0 J y0 }* P4 J: n& F
| MCASP_TX_SYNCERROR" w) D4 [. L( h1 b7 x4 z
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR % L( [' E, L0 \4 u/ X Y2 D
| MCASP_RX_CLKFAIL. e# n# I- a+ T, j$ c/ T' r
| MCASP_RX_SYNCERROR + X6 s) x6 Q( p! K3 B
| MCASP_RX_OVERRUN);, d% C/ c! b8 Z+ L( y- I( Q, u+ \
} static void I2SDataTxRxActivate(void)' V( E2 ] q3 \
{4 _, x' `2 B! R- V. T3 h
/* Start the clocks */
/ v: B8 X L7 o6 o: O6 u$ h: LMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
8 p! K6 R# ^; r" K8 T6 @McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
3 `1 m6 C0 x2 Y! NEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
! @- C3 ^- _7 G! R, ?0 l) l5 TEDMA3_TRIG_MODE_EVENT);3 M8 ?0 T; Z% J% r
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
7 d' A* x2 t' P# C) W# H6 sEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
) D' D1 m, ~7 B0 }6 e4 cMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);3 c' F3 a7 i$ Q4 r# [
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */) B7 o2 `7 V L( l- N4 r
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */5 \1 [* g6 _+ d
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);2 s! O0 c; Y K4 I- x
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
* M2 w- @' j# l" W& A} . l) U G" p0 o7 {* C7 {# h7 b) l
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
# z6 q# c" V4 o |