|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,1 {" `1 H! b% ~1 F: B
input mcasp_ahclkx,
@- x' L9 r3 }4 Y4 ?* R7 T& S& ~input mcasp_aclkx,* j& I2 J. i/ {1 t$ Y* a _! [
input axr0,
/ ~; ~; b) z7 N L& H6 x
. A. F4 G5 A( X* D3 Doutput mcasp_afsr,8 d Z9 I" T: G% C$ @2 S
output mcasp_ahclkr,! Y4 h% M4 y) Y* v* N# m
output mcasp_aclkr,
8 j* S3 j& e% V2 W3 e7 I0 youtput axr1,9 X! \- ?- a& D! O" O" k& {
assign mcasp_afsr = mcasp_afsx;
& n9 `! ?1 a( ^4 sassign mcasp_aclkr = mcasp_aclkx;% a, u) R2 T. [/ y
assign mcasp_ahclkr = mcasp_ahclkx;
$ w4 k/ G; h3 {- g. ]( I: Lassign axr1 = axr0; 2 Q6 n, k8 a/ L. P* K: O K
& k7 Z5 ]$ t, U9 j% S$ \ a
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
3 _% g2 c* ^5 e8 P/ A: V5 ~! zstatic void McASPI2SConfigure(void)& C8 B) o* z' a
{
I4 j' G1 p* Q& SMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
7 H# i) {) G: a( [0 T1 e6 Z/ gMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */) C- ?* d2 x9 S+ U. f1 w0 N
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);6 a, p8 G* c9 y: Y2 B
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */. x; o8 b- L) N. {6 I, `, f
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. r9 {0 u$ n6 B& K: k. D( [! iMCASP_RX_MODE_DMA);
6 ^4 X$ v. H. m. @2 |- H% JMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
; U8 _* \5 v2 ?9 W2 Z. p6 j- ]* bMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
& S, X3 X" w$ b T7 |. sMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 0 Q. c( Z' \" M
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);, T: m) A( j& p( A
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 9 E' `+ {/ x: e8 U a
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */ B7 ?% T& | {+ |4 A
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
. d8 {0 `! w0 C" L) H( qMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ( m5 i* a) Z7 [, P& T. x3 \
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
$ }7 \0 B) b# }6 J+ K0x00, 0xFF); /* configure the clock for transmitter */
9 Y+ q) m7 d6 Y) R1 PMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);6 p& D4 M/ U% j& ~- j
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
1 `8 M5 }7 X6 y' UMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
. G% X6 Y+ E& X& j4 u5 C0x00, 0xFF);( T# i3 ]' `7 J, E+ J' H( m
L& F) S% ^, _& s/* Enable synchronization of RX and TX sections */
% S- B% f$ ?* [2 a, F1 LMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
: s) P- i& Y3 z' W, n; S( |, s0 `McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);" t) { w& O! q" A& `
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*1 O8 X" [) [1 K" Q+ M3 }+ Y- o! c4 Q9 v3 Y5 C
** Set the serializers, Currently only one serializer is set as' l* P+ }8 L7 Z* e5 L3 p5 x
** transmitter and one serializer as receiver.7 m0 d! r+ U5 b0 g$ V
*/ e- L2 e( |3 L4 ]
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);8 C5 F# ~1 j4 z' M! R: {+ G2 Z+ E
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*( V* b+ S8 Y. `- a
** Configure the McASP pins & Y. H9 \2 \2 O1 Q9 G
** Input - Frame Sync, Clock and Serializer Rx
5 ?, D+ m* w' i3 |; K+ Z1 ~3 i** Output - Serializer Tx is connected to the input of the codec
& B) W1 |1 R% s+ w*/+ u& ~0 `, P9 ~( E
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);0 ^9 j# d6 G* g; t& ?
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));, }) ~% U& |6 h0 C) Y" [( q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
4 U& Y- w2 f4 {. Y! d% X7 _| MCASP_PIN_ACLKX% i! i. t& L8 U! _. @9 Y
| MCASP_PIN_AHCLKX
$ w4 N3 a T) Q: c3 T' \| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */7 o9 D+ o1 P0 h7 i3 V) m
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ) T! Q9 x- q! S k1 z
| MCASP_TX_CLKFAIL
' U4 I( f9 h: {8 l: u| MCASP_TX_SYNCERROR2 d$ K: x ^7 C
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
* @9 l6 [. g p6 W% c+ l| MCASP_RX_CLKFAIL+ G8 f3 x H; k Q' h# ?
| MCASP_RX_SYNCERROR ! e* U% O1 n! E3 \' \
| MCASP_RX_OVERRUN);
# O& Z& P; z8 J: O k) p$ b} static void I2SDataTxRxActivate(void)
7 j! V" B: p* u& U{
# I, K# p3 Z( j4 j/* Start the clocks */& a/ T$ F0 C/ m: T, W. M8 w
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
W6 t6 ]' @' D2 _/ m2 r( S" e& ZMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer *// Y$ Q2 m3 p* L
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
4 N: m w2 P! l2 NEDMA3_TRIG_MODE_EVENT);% N' P. g% ?; p' I5 {
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
3 p* M: D# w' }' oEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */ P$ H3 {) A: p( A4 A- e; ]# F/ h: f, d
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
! @; V' v6 s( B! bMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */# A v% i4 N6 R* W) k1 c
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
& R8 m2 `5 p" b9 ?) J% mMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
" \5 E$ r) P- A8 \McASPTxEnable(SOC_MCASP_0_CTRL_REGS);, L n7 |" h% x! @/ L+ O) o+ n
} " ^1 {: Y0 u4 g5 L7 @8 e5 h
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. - U" y! p$ p* o
|