|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
! C, B* Q: x7 C- Ainput mcasp_ahclkx,
: k* j% x1 O4 A# v: d- F5 ?input mcasp_aclkx,! u" e; B8 s( R* K/ J
input axr0,, y. o, d% W4 {/ f) B/ _0 C
- M' b" {/ r6 K+ {) o' E
output mcasp_afsr,' @8 B- b M/ U a5 \% F# L
output mcasp_ahclkr,
' c7 I5 Z. z0 U& v7 |output mcasp_aclkr,5 X* E, T6 E; a7 i) X
output axr1,
# E. k! ?/ j) S assign mcasp_afsr = mcasp_afsx;
! u; H, K( `( v1 ]) Y) qassign mcasp_aclkr = mcasp_aclkx;1 T$ g5 ~+ `3 J+ h% Q8 ? C* k
assign mcasp_ahclkr = mcasp_ahclkx;; [' ^7 V' t3 f1 ~4 f# m6 R
assign axr1 = axr0;
* V& X: f; P2 F. f: C" k3 z6 c K$ t x$ _
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 & I+ c0 k1 Z" A9 R0 S$ ^
static void McASPI2SConfigure(void)
6 }5 p4 h0 z! S7 v; V{5 G) v) Y; s( F1 U1 m L% D/ m
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
% O7 y' _+ D4 f) q" H1 s4 j/ B1 Z7 iMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */5 Q- D& A1 x( @# P( q
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);& i* M R5 L$ ], k
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
. I+ f& i/ q/ e& |5 r2 MMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" ~: t7 \4 V& b9 ]1 gMCASP_RX_MODE_DMA);
' @& f8 _8 b( r n- _. n/ q# ^McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ }; b2 b- P( g1 b- b
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
4 s" N8 v2 Y% UMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
7 p1 y/ d% [! {4 E/ _) mMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
7 Z/ U0 D ? ^1 `; `McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
5 j* B- f; h! r5 x& w; [MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
5 ?* ^* `- L& DMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);: \8 W* g" f, r" ~7 c
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); % p9 R% B+ H3 k$ l7 J% z
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
5 Y* P; G$ w" x$ l3 ]0x00, 0xFF); /* configure the clock for transmitter */
3 U+ q0 H6 n3 K* j* T; `% v6 P- CMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
8 {- G. @% W! I: A1 IMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
# d$ ]' y7 R0 @2 b Y4 H. @) jMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
2 D# X- o- h; r# m- x0x00, 0xFF);9 U- a# `$ e1 r9 g2 o% Y
, O4 n, Q: ]: E4 p4 w- b r
/* Enable synchronization of RX and TX sections */
2 U! h8 K8 L L# {- PMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
# H3 j( S* `. o+ Y( ^* NMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);3 B. o3 H7 r' y
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*8 w4 ]) J7 s6 }. _. g2 L. D
** Set the serializers, Currently only one serializer is set as
$ P7 Y$ b9 m# j+ l4 ]& j8 I3 N** transmitter and one serializer as receiver.
2 c' _* t! Y2 S" n*/. Q% M) H$ U4 N+ j
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
8 V# p* U0 N d0 b1 p3 j) QMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*$ O+ D7 o/ k5 [+ {/ }% s; x
** Configure the McASP pins
8 P# N' ^$ \3 R( J' C/ v4 w. g0 D** Input - Frame Sync, Clock and Serializer Rx
8 s6 s- Q K, W* D** Output - Serializer Tx is connected to the input of the codec
. @; k2 W( |2 O+ O Q1 b# u6 g*/
. N7 c$ x4 T/ Q/ }! M/ G* T$ IMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);/ ^- t* j7 G4 n. s" F$ z! ^3 L
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
* t6 _/ J) Y9 f7 t8 m# o' [McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
" M7 C0 m! y X4 P" \, n| MCASP_PIN_ACLKX
g* A: E. \9 ^$ V' G4 l, Y3 Z$ k) p| MCASP_PIN_AHCLKX" W/ B: C+ @+ O; B. Z7 ]
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
+ ~& a+ f. P/ _McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
: U" b7 ^6 c, L8 H# _ @, k+ [8 j5 o| MCASP_TX_CLKFAIL ! ~+ {. I6 W8 u* u* R
| MCASP_TX_SYNCERROR
* V" i% {9 ?% |- b; C& e* V: @| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR , [# U/ T2 K0 G3 B( F6 V8 o" F
| MCASP_RX_CLKFAIL
( ` u+ R) T9 x| MCASP_RX_SYNCERROR ( S7 }) a' B& }# g% M E% O, Q# R
| MCASP_RX_OVERRUN);
4 d& T: k: L: Y6 E" w} static void I2SDataTxRxActivate(void)
- |+ A- W* ~7 D: u9 T0 V& V{
$ Y3 O2 @0 n/ J3 s! k) I/* Start the clocks */
1 v1 H8 ]/ F; O; f4 i3 J W$ ~McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);6 `9 K! R/ R- y
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
8 M9 i8 q0 d! H& Q. m. G3 Q( ^EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
. a2 `' R0 U5 ^) bEDMA3_TRIG_MODE_EVENT);
( C1 O5 E2 V4 X2 {& k2 ?EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, & H( Q/ F$ {" F+ I
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */3 F5 ^: R+ X! A) D6 Z8 B
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
# @& Y( H! l% y _- F6 n! lMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */& S+ ^, }* k1 C- J" n; S1 u
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */9 d% M! _1 C8 D! r
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);1 Q. F: F. {" r+ `, G1 ?- M
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);6 H3 T2 s% U r
} % x3 N \! t+ n
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
; F! Z! Z) I( y! k |