|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
" }' |/ P6 @8 v, `% A: dinput mcasp_ahclkx,
1 E4 |. p( m: x" Z9 j. }! j5 sinput mcasp_aclkx,
5 ^1 c! B- S5 f& winput axr0, \$ d& B l/ n2 T: y, ~
4 Z& i. O6 P& m& h7 P6 ]; x6 Z, \# R
output mcasp_afsr,3 j" V/ W. A% n0 k- a. d
output mcasp_ahclkr,
9 {$ `4 Q. S) P7 m, J; _output mcasp_aclkr,
7 y" C) f9 {& {9 {: r- goutput axr1,
$ K3 j7 _4 ?2 j) x% {0 A assign mcasp_afsr = mcasp_afsx;+ v5 N& u, x4 ^ Z, B8 l$ s! }
assign mcasp_aclkr = mcasp_aclkx;: d, {& G9 D6 b% u: A6 M* P% u
assign mcasp_ahclkr = mcasp_ahclkx;" H; ]. X/ o$ \3 R6 a9 H+ ]4 C
assign axr1 = axr0;
0 X# X5 t. T7 y3 u0 `% |$ U5 A4 \/ n6 C8 k3 U( N6 J4 U
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ; y, n V! l6 j+ l
static void McASPI2SConfigure(void)6 K2 G& M4 w- c& A! v% v) a
{
& _# K) Z5 i7 MMcASPRxReset(SOC_MCASP_0_CTRL_REGS);9 O" T; i+ U6 {& @
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */$ P7 z R2 L, ?" T2 S5 ~# f
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);8 H9 }4 p5 ~( _1 W1 k6 l% ^
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
' P$ L a& _) k- F+ |McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! f% S& \% o" s$ @
MCASP_RX_MODE_DMA);3 _. [8 B1 b K9 Z" R3 u
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
; U" q ]) Q: A$ G5 L P8 jMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */" }8 X- g3 F; z- v1 z) u8 F \3 r7 `
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, % Z1 g" d/ Z: T* T* a# e' B1 ]" U* b
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);) T& q3 l: a0 b3 ^- }3 Q
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
4 J8 x+ z7 I( FMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
7 w1 B0 x3 p0 M o0 M+ d1 rMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);: \$ @) X* m2 O5 y% W/ {9 d
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
4 ^8 ^* I" z, `6 xMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,, E( e* n6 F* |6 l
0x00, 0xFF); /* configure the clock for transmitter */3 B* l& u; b1 o- E& k
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);, N+ ~1 R6 ?3 N. y v
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 6 v8 ^7 h' l4 C
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
; u7 `( s; q) c. E/ P- A# ?0x00, 0xFF);6 _4 c+ a( @- i& g' |
8 J' }- q; U) Q* E) U6 V! Z) I/* Enable synchronization of RX and TX sections */ 2 F3 o4 P( D" V1 q' v
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
+ M6 Z/ x4 A d1 K3 f7 b5 hMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
. y, K x, w% _4 sMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
/ j* h) S3 C( |' R** Set the serializers, Currently only one serializer is set as
6 i$ L: z0 A4 h- P0 w) L3 `** transmitter and one serializer as receiver.8 A2 b2 ^0 |; z: D" Y4 T1 C- {6 N
*/
# O# x! _2 D4 t, _' D9 Y y' ~McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
8 P9 e) I$ ^$ sMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
2 e9 S# C# n. r C** Configure the McASP pins " [- f8 @7 }9 d; k0 T+ F! O
** Input - Frame Sync, Clock and Serializer Rx, K+ e- M8 F5 x3 H
** Output - Serializer Tx is connected to the input of the codec , S$ q. p# H: j% [4 ]
*/) n1 D! y* c+ `+ |
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
% Q8 @( u) D4 o: [0 s. p. v8 ?McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
( z$ d! }3 |6 i5 ZMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
& p ]& ?' F2 F& s& _| MCASP_PIN_ACLKX* n4 P( c {# b! B8 \
| MCASP_PIN_AHCLKX1 s/ l; z' L$ n; m3 d' a) }' G
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */; F, g' ]4 p; V. q: ?7 ]& Y
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ! N6 i& G7 A& ^1 J
| MCASP_TX_CLKFAIL
5 Y! r; C Z6 X' z. V8 f' o| MCASP_TX_SYNCERROR
( G) {1 B. I' C+ t1 X| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
+ n$ O9 f6 g7 k" i' t| MCASP_RX_CLKFAIL
4 W' L. k( d: U| MCASP_RX_SYNCERROR
) M+ K2 P0 u X! ^; @" X8 R4 n| MCASP_RX_OVERRUN);0 r% h. y0 n8 Q# o& m& h- J. X
} static void I2SDataTxRxActivate(void). v+ o; m9 K8 B: B' G2 K
{
# b3 `8 a: H+ {; q/* Start the clocks */
& |4 [6 q: R. q. u/ uMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
/ k9 z9 r- w- l3 Y7 EMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */3 B) r/ v; j4 z8 P, [- _
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,- m# i: B1 n/ x: g; r; h; n5 }
EDMA3_TRIG_MODE_EVENT);
2 R3 J8 ? t4 B# N5 bEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, % N( }4 S( s/ t- L5 T
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
6 Z; W7 q) X6 d3 nMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
" v& Q" h# C3 s3 ~McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */% }" b" ~1 k( [& ]8 V3 h4 o; ]& S: r
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */6 I! p) {! W4 e; z) W7 _
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
# P7 V. L3 C* w- o6 y: B$ c6 _McASPTxEnable(SOC_MCASP_0_CTRL_REGS); m, r7 ?/ `* R4 ] ]
}
2 W5 t& d5 s4 v. S4 k) E5 A( [8 w请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
5 _ H% L4 L& ]9 H T2 Y6 L |