|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,7 e0 f8 a* Q& d3 |
input mcasp_ahclkx,& t$ x6 t P/ s, M
input mcasp_aclkx,# R8 a5 M1 ~, s" }4 T
input axr0,
- o9 o% _& j9 r. v& G3 E
6 z) T9 U2 r+ i7 houtput mcasp_afsr,
6 m/ V' A: C, [1 l4 r: V. eoutput mcasp_ahclkr,- ~4 ~3 k* H; H' u. b) B
output mcasp_aclkr,+ @- `: [8 ^7 R2 G
output axr1,7 ]/ j% s/ A% |5 r1 e: b: M: d! x
assign mcasp_afsr = mcasp_afsx;
z; y8 L; C; H massign mcasp_aclkr = mcasp_aclkx;1 [5 y; d3 r: w; v" @; {1 ?
assign mcasp_ahclkr = mcasp_ahclkx;
4 Q! j6 m4 _# ^: Cassign axr1 = axr0; . s5 K n) O5 |: W
7 V) F4 U6 d) [. i8 A3 n
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
; f1 S8 o5 n2 m8 zstatic void McASPI2SConfigure(void)9 M! }+ z( J( [& ^2 H, `' g6 X3 ^
{
: m& \4 }. u5 {# H( G+ B3 LMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
- D: z2 B# U7 W2 y! r% N- h# n( cMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */3 i6 S; w F$ {' B6 V
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);; j, D1 _( T) n) L( ~
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
; ~9 V9 \8 m7 {5 M. kMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,$ R/ p4 ?' P% ^
MCASP_RX_MODE_DMA);' h/ d: ~/ r3 [( n, x( A7 C O! O
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 W3 b0 r1 a$ ^8 i t" o
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
1 F; [3 ]2 o+ W& NMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, / W9 u) `+ h+ N. E
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);8 `$ V' v& i; o! k- n# M
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, # x# A. X2 O" C2 u5 y" _3 e
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */" ?( s% W3 X9 D' `% S( q" M
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
+ N2 {' \, i4 h% z: [; N$ \McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
! Y* L1 n [& _) u- h; VMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,6 b* z8 h/ A5 o8 F. \4 Q& t6 u& r, m
0x00, 0xFF); /* configure the clock for transmitter */
% E3 }# w2 \8 @- MMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);# B6 f# _# ?+ c! W1 V1 y/ D
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
7 B: k8 k7 O- DMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,' f# U, g1 C+ F8 S$ i
0x00, 0xFF);
" K. b; |. t' _/ c8 v, T: z" J, N8 M7 Y3 w
/* Enable synchronization of RX and TX sections */ " Q0 S9 j) p3 A
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
! h- h% |, Q- fMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);# a2 j8 Z) |. ^2 ~
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
v# L# u+ Q2 O h( I) |** Set the serializers, Currently only one serializer is set as# x& w0 N0 C; c. g5 H
** transmitter and one serializer as receiver.$ g& e" B) R, N$ s2 C2 u" T9 I
*/
8 _) v& } }& K6 z4 ?" S& RMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);% N, I- v, }% \9 e. l: x( m. d0 ?; ~" Y
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*1 N& P0 q3 U2 t# d) |$ J
** Configure the McASP pins
1 @5 k: s0 Z5 R v2 Q** Input - Frame Sync, Clock and Serializer Rx7 I, `* Y" b+ W" U# m7 u
** Output - Serializer Tx is connected to the input of the codec
! v0 F0 `8 L- ]; b; a) U*/4 n/ I& [# A) R
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);" L2 z4 L& k# {) U# L3 J8 F
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));& {% e' D4 E5 y7 f }, t/ Y
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX+ L* k2 o& a' r* h& j7 s# }+ u1 ~
| MCASP_PIN_ACLKX/ `8 ~( B5 R/ |( t, Z$ z
| MCASP_PIN_AHCLKX
9 j' B+ T9 S6 ^. J4 w/ B| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */- L5 S$ N+ H" b$ s" M
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR , I0 P- w6 \2 z" e" d' g
| MCASP_TX_CLKFAIL ' Y5 e% ?( }* b, j- Z
| MCASP_TX_SYNCERROR
/ ^8 V v# h" \" M! ]7 T, Q& k5 _| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 2 E* M2 C$ b: w% Q; [
| MCASP_RX_CLKFAIL
* l2 C9 T+ x: _5 \( R; o5 m| MCASP_RX_SYNCERROR " q; r" B" Z( }3 H
| MCASP_RX_OVERRUN);
( S3 X% f9 H+ C' E} static void I2SDataTxRxActivate(void)
% W' ]* }5 q9 c& z1 D{, f2 A" L; k( b
/* Start the clocks */
" K* z+ g/ o+ n9 b; E' N" M, DMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
) X2 L, J4 Q9 n1 Q" [McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */5 m: @6 H8 \+ K( z6 l5 o
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
+ H' T9 V: x) ?0 h& o" i& TEDMA3_TRIG_MODE_EVENT);. T8 _3 ]1 X+ h$ c2 q0 {7 s8 V
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
( g+ n4 U2 _% a \; NEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
# L, W$ c& j0 R$ ^7 WMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);* o# E5 X$ s0 y$ p' ^4 l* @+ `
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */. ^* z) y' w$ p: Y$ T/ `; P
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
, Y3 i ~0 m( `% U! F+ g$ Z% zMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);/ S$ r, Y$ E6 ]; r
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);( t0 \7 G1 {5 v/ |6 y; n# o6 ~
} 3 U. W I8 }) _9 @
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
& Y7 t7 }; B8 Z2 P! C6 | |