|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
+ q0 ]( j$ g0 e& uinput mcasp_ahclkx,5 A8 r6 x% r7 I
input mcasp_aclkx,9 [) y* y8 {# k5 ]# K
input axr0,
8 m6 m g* E, r2 p( x+ ?/ v) V4 @( _2 F
output mcasp_afsr,1 z( U8 {+ f" R2 t
output mcasp_ahclkr,
# |3 |7 L- T# @8 L, s6 @$ b9 Boutput mcasp_aclkr,2 s9 } b9 a: C0 _# z( ]! w
output axr1," n4 F& V' G: @! D6 h
assign mcasp_afsr = mcasp_afsx;
. q$ O3 D3 n. S0 @$ massign mcasp_aclkr = mcasp_aclkx;# ?8 q' w% c6 x1 _3 H1 Z+ C
assign mcasp_ahclkr = mcasp_ahclkx; s" V& w) Y! R
assign axr1 = axr0; ( ^5 M9 M) h q* R% M8 ^7 {8 s! w
4 p$ p e0 r% r) e- b$ o* X% W; ?
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 % l! ]$ g3 R! M
static void McASPI2SConfigure(void)9 f, h8 G9 h" c: \- d
{+ Z' n) Z4 N, l
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
" W V% U$ I" m2 LMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */+ V ~2 o7 k F2 e/ U0 y# |
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
1 D' f8 Q7 l# @* k; rMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
! q9 D6 w# z2 ]$ a5 B- |! x7 XMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. o1 w1 ]* G* P: ^2 IMCASP_RX_MODE_DMA);# l4 E' W1 i1 K8 B0 e- G$ Y( Z0 T
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE," u" U0 y4 z" F# P# B% r J3 B
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */3 D3 n5 u3 }) y" n
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, _& Z+ v* y5 j
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
# G6 ?1 O! V% j" B! FMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
; e* z3 M) V uMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
8 n+ c8 v8 N( iMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);4 {; r/ \9 ^! ^; r! P
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); % {/ }* }) I% a M; y8 [9 ~# t
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
5 m! B" L1 y2 T; Q) P3 q0x00, 0xFF); /* configure the clock for transmitter */# Y' w! @7 q0 |
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);. g7 X) e2 T4 [* s3 v" q9 q+ g" U
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 7 F( j! Q; D- a. ]; J0 P8 ]
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
/ q5 X; g! {2 \+ g1 z0x00, 0xFF);7 F2 T+ J) z0 m: T7 B* J3 X9 M- [
8 d0 T) X6 q9 k" K
/* Enable synchronization of RX and TX sections */
1 P2 ?( b3 }' n; l0 [+ s LMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */: ?# p9 t' ?+ s. s
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
9 w) {1 v/ X# v6 r p% _2 tMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*. z9 @' y3 g* k! a
** Set the serializers, Currently only one serializer is set as
$ f% Z1 K, D% n2 l' ^& A- [** transmitter and one serializer as receiver.& _, O6 X" p$ J( P
*/
" ~. f1 W& G$ P. H8 _McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
0 b8 [+ Z1 \4 B6 h. ]McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
9 d: Z q9 z6 \1 [. Z5 }1 n** Configure the McASP pins
, m) |( S$ m) E) R- o5 Q** Input - Frame Sync, Clock and Serializer Rx! q& `8 m4 ?9 h) ~0 r/ n+ d' B' W
** Output - Serializer Tx is connected to the input of the codec
! k4 D* a0 H1 `$ ?% {! ]*/
# I; E% D& ?% d2 x! KMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);/ [: |1 B P' k% G
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));$ o6 J2 V" b' g+ _) q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
% h* R F/ W, o1 C. R| MCASP_PIN_ACLKX: C$ O& E; |6 }' ?3 J
| MCASP_PIN_AHCLKX' f( }- @4 M7 q9 b
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
i- h4 F. U3 qMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
. j0 Z% u& r+ R* ?) u: |: K| MCASP_TX_CLKFAIL % C" K7 b- |+ X. M
| MCASP_TX_SYNCERROR
/ J# F/ p9 a* m' ]4 ]7 h$ S| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
0 G8 O3 Q! U' F| MCASP_RX_CLKFAIL
) ?2 C7 Z2 O9 a2 T| MCASP_RX_SYNCERROR + a7 f5 C: ^: p/ W( V4 d! b5 a
| MCASP_RX_OVERRUN);4 t6 h6 T$ L1 I8 F3 g/ S/ V
} static void I2SDataTxRxActivate(void)
8 w/ C+ e: |& I; ]6 x! F8 i{
* q0 N6 I( U' t: o! a0 u/* Start the clocks */
) K5 e, L# @' w# T; T2 rMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
2 b& S1 r% ^" ?- O) r sMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
4 W5 t F- O* m) lEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,5 F1 g$ A; }5 y2 H
EDMA3_TRIG_MODE_EVENT);0 h- P1 ~+ y5 X8 {! i; ]2 E9 }
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, % z* f; @9 s3 y9 }5 A
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */2 g8 j# u- {* p7 G7 ~ x
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
, Y- E+ ~9 _5 @. K- h0 C3 j, CMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
$ E) b. O7 v- |3 P; J% r' lwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
' Z+ t+ F+ v5 |McASPRxEnable(SOC_MCASP_0_CTRL_REGS); T( X0 j- }2 \% c1 e$ M
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);! ^ W% ~' N9 Z5 O0 W/ z5 z& o" \ t
}
1 }& E. p P( x2 v, ^6 W" _; o- T请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. $ U" G0 _; N. N9 y! G' t
|