|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
$ s" `) r- K" V1 A( v* [input mcasp_ahclkx,+ c' _. k. F" D9 {3 `, Y! Y
input mcasp_aclkx,
+ c p6 [. j- zinput axr0,' p p( K' F0 f" i
. v; ^5 O3 m8 I# A$ R" |; @' q
output mcasp_afsr,: f) E/ j1 U! I3 {! l5 ^& p
output mcasp_ahclkr,0 ~4 B0 w+ o/ s% h, X
output mcasp_aclkr,- g) R: d4 |8 X6 U
output axr1,- q0 g- f) k9 x+ E
assign mcasp_afsr = mcasp_afsx;0 V7 ^/ l0 w* ]! _
assign mcasp_aclkr = mcasp_aclkx;: G: P; @5 s: P8 c
assign mcasp_ahclkr = mcasp_ahclkx;
, J- e& S3 Z* z5 a! F) i3 O& gassign axr1 = axr0;
2 w2 X' x' y# E2 P
5 R5 _0 @# F3 _7 N4 }在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 1 s/ S, a# U. ^) r5 E
static void McASPI2SConfigure(void)/ d# @- q# B0 k! y9 l( d" ]
{) w! Z8 t2 ]& S8 _' [
McASPRxReset(SOC_MCASP_0_CTRL_REGS);+ P: ]" B( s8 d; y2 M
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
# `6 v( y0 h/ zMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);* ?$ S- N( U! ?: q4 {
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */- n% J8 ]3 o. o( A8 V
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 m. C+ ^2 D+ Q, f# T iMCASP_RX_MODE_DMA);
3 g* P6 c" U" W, |, HMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ Q) f1 v5 O1 L( W$ S6 o5 s JMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */, ]; Y, u* W4 c$ }/ B
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
, |: {" O1 f5 {5 @1 x UMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
; r8 X9 q8 P" `% PMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, n \1 \" r5 z ~
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver *// y! H4 w3 l; z* n/ T
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);/ a" a& ]( i+ S7 i$ v" a
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ) ?0 ]2 g0 k( ?" U
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
% f8 f" d7 v( e; s) _- j. v1 T% a0x00, 0xFF); /* configure the clock for transmitter */
9 Q: @3 e' Y/ e1 \' x v; \) TMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
' O7 E" j+ } d m. x" x, j+ d* TMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
+ x4 E: A. }% x# CMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
/ U& w- c! n2 u6 T/ O8 Q f0x00, 0xFF);1 P1 q9 Z: B+ g, \7 g' q
9 S4 p" M, X9 r
/* Enable synchronization of RX and TX sections */
7 _# B/ l/ _' A. s9 v+ v. ZMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
' m2 A4 `) L$ L% ]/ p3 |$ iMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
7 T5 Q4 B$ F% L; vMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*/ r% l; i8 `0 e) m7 a3 a7 J
** Set the serializers, Currently only one serializer is set as
7 E5 d' V d! x' e F/ ?** transmitter and one serializer as receiver.
6 [" j5 X/ g& l, a P* S*/
e ?; d; T4 D1 j! @$ Q. L3 DMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
$ e5 X4 r( Y3 B# Q# Z& pMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
, h* N0 E! D" A1 k8 q! v** Configure the McASP pins 5 a0 g" X2 a' p% h9 n8 W
** Input - Frame Sync, Clock and Serializer Rx
' @5 L/ d2 A6 [2 Z& A** Output - Serializer Tx is connected to the input of the codec
9 z" A" @( X- D! t5 d*/
- D( j( }2 ?6 x3 L4 c; u( FMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
3 M7 {6 N7 S9 l' V% U, u$ [! C, t1 ZMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
{; m0 o! _6 R% a, J2 J$ WMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
J" \% M0 Y% V| MCASP_PIN_ACLKX. y4 G* r; d6 `" W3 z$ S7 {
| MCASP_PIN_AHCLKX
7 h5 U8 J @% L2 ]- L7 A3 N| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
0 Z% K* a! O3 L0 c$ J/ nMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR . d2 I7 h6 N6 \
| MCASP_TX_CLKFAIL 6 M. @( U5 I+ v1 F# D
| MCASP_TX_SYNCERROR2 Z7 U3 X( x# e5 W) I
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
6 i( l6 y* Y( A0 u! u| MCASP_RX_CLKFAIL% i, C5 M6 n5 W& m% E* c
| MCASP_RX_SYNCERROR ' A- [1 w. n5 B6 o1 e% C. X+ {! V
| MCASP_RX_OVERRUN);: c- I3 P1 v/ r. F1 z0 h0 _
} static void I2SDataTxRxActivate(void)) s2 z/ k' ]# w! r; N. g
{
{0 n# `1 d" u9 {/* Start the clocks */
4 o( v7 o, i+ Y+ TMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);8 }8 _2 @/ M0 a4 I
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
1 a; \ E1 H- \% l, E- V2 A4 w$ HEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
6 b' P9 X' b4 g- Z0 E6 e. W, cEDMA3_TRIG_MODE_EVENT);- _: T; ?% J- q; ^9 k9 Y+ f8 n9 J2 v
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 6 \6 U1 Y" P" m9 F
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */2 u/ s1 r E# l5 d. F% x% m, D* t
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
; x+ W+ t7 X: j7 r/ XMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */ Z; E3 d# _) b' R- M
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */5 [4 K. S1 A! B$ _2 {
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);# e, _6 M8 A( P& i! J, N& A
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
) Z# i1 G% V$ e) X( d V. F} O9 P t* T' }4 w/ s/ Z! k# W
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. & V8 _' C- Y/ X, A7 ~
|