|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
4 L2 k y) t5 D3 C3 [input mcasp_ahclkx,
( A: d) D( A p5 t3 s8 @input mcasp_aclkx,1 C. q1 U3 n0 J# l; d8 w! r
input axr0,7 J* l# ]4 F' P% |
4 R- f$ \& l6 b* [" V( x' U
output mcasp_afsr,
% v! d3 y9 T# \( ]8 y" E! {output mcasp_ahclkr,& d! x, Y; W+ m' d8 E
output mcasp_aclkr,/ z& f i2 g4 Y! [5 q
output axr1,5 O1 ]8 A7 g& [' l/ b; {
assign mcasp_afsr = mcasp_afsx;8 a l3 I! s! I G3 a- f
assign mcasp_aclkr = mcasp_aclkx;
! d9 d. P6 c$ P; V$ K+ U s: Massign mcasp_ahclkr = mcasp_ahclkx;- H9 @ R! i- t. I0 i
assign axr1 = axr0;
: `/ W" x- D9 `2 f9 r
8 O4 l' }; z; b0 |3 L' Q在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
% }1 q4 d& P; b, e' U+ |static void McASPI2SConfigure(void)* z! i- q3 W0 B2 d m8 w$ u* Z
{, V+ _5 P2 i g9 E# n
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
" u y: @3 `* Z EMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */2 X: I8 o! T% B$ _# Y: k. n* r; }
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
5 S9 l" d R+ jMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units *// [* f+ F1 u6 Y3 A% d7 {' x, R" u( p7 p5 e
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,% r( _5 o& P- `, \
MCASP_RX_MODE_DMA);
) {( ~; L" K5 `7 S4 M5 GMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) U O: g- y" s k3 kMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */! t, Z" w0 \9 M$ Y! Q
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
* }9 e) q* W& I& ~MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);% X$ O. x; y+ n; g
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 7 `9 d2 t& ~5 F6 X4 O/ B
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
4 U- r7 e8 q7 V0 `6 z7 r! EMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
: d4 T R( j' i* g/ pMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ) |1 T: i& w, ?: L* \& V
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
; I/ j! o2 O. \0x00, 0xFF); /* configure the clock for transmitter */$ D" x2 [2 W& E i1 F
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
d4 r5 O# G k! G4 m3 v1 b5 ]; W- MMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 0 a$ r* K/ j! d$ Z$ i) ]
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32, d6 N) }* P& W8 E% A
0x00, 0xFF);
2 G) t+ g. E, P2 R1 @; M3 S9 b" A$ ~5 x# Q2 ~
/* Enable synchronization of RX and TX sections */ , j' @7 L/ B/ G2 \6 u
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */1 L, M' S0 a7 _9 n& L) ^% a
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);( o- V" R; |, o" s1 } C
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*4 |& o' ^- W; f- x
** Set the serializers, Currently only one serializer is set as5 S- W4 D: `" F0 w2 |
** transmitter and one serializer as receiver.7 f$ X- p, ^3 ^' @# {3 ]+ Z2 v4 ?: m
*/ |0 k, v& R1 M
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
' V9 ]; u# d# z! JMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
- s9 L0 R$ a5 V** Configure the McASP pins
8 ?" p6 V5 [- Z9 A4 l** Input - Frame Sync, Clock and Serializer Rx# J4 V" O7 r$ N! Y3 J9 x8 d0 _
** Output - Serializer Tx is connected to the input of the codec : e* J/ Z* `8 @
*/
- _& r7 Y. Z1 e4 [( j7 CMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
9 {, W9 k, y& xMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
0 J0 X2 D9 \9 @) b3 aMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX, b& S9 R9 Q/ ^8 E& u. K* o5 l
| MCASP_PIN_ACLKX
" T. H. L* f, p" e| MCASP_PIN_AHCLKX
J& G( j+ P6 J) ]# a2 i8 a3 k+ D& `| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */0 F0 a! M9 l: S) i# E j2 V
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR : X; U: w+ z6 }; z9 R# s8 p( G
| MCASP_TX_CLKFAIL
$ O7 j5 v, V7 e8 M| MCASP_TX_SYNCERROR: z$ A/ u H! v' {
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
- ^ c, ?2 J* q6 f# n" j" U| MCASP_RX_CLKFAIL( T1 ~: o5 U$ D' L' T2 B
| MCASP_RX_SYNCERROR / k2 `/ X/ S" B1 w- O0 A4 D' g
| MCASP_RX_OVERRUN);
0 q, I2 K' y( m( m4 W" e& p} static void I2SDataTxRxActivate(void)4 ~2 J0 u( q& ?. B+ R1 P
{0 Q: w F# r! @4 ~
/* Start the clocks */& L: V L5 ~! i. l1 M
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
6 \0 h' B" L& U4 B' RMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */& x$ X% f A/ ?( E
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,: _- D0 k0 o, J: j
EDMA3_TRIG_MODE_EVENT);) w; G+ p/ J K/ b7 F; a4 Y# s
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, # b, ` T2 V; v- O6 S# |4 S
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */. q2 `: _" B- }! u h8 q
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);* s! Q9 k; M" v8 V
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */1 h6 g) I; B) X; E o
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
( q* ]/ e4 c* z6 \+ h* |' g- RMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);" i$ q: K: n p; L5 e6 X1 ]$ W- u
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
7 J( ~) Z- M# O" B, D} , Z5 ^* z1 U: l9 _" {
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 4 d3 [! G% v0 @" {# ]
|