嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,# G5 X* X& w( }# o6 z
input mcasp_ahclkx,% |* ?/ @6 ~4 {1 N! O; T! ?% a
input mcasp_aclkx,( Q: y) z4 n( \8 U
input axr0,
2 S( r. ]+ l- Y; s
6 c. y, w$ d5 l5 P) ]1 Doutput mcasp_afsr,
' D+ k0 B) a) j* f' d. G( ^output mcasp_ahclkr,
% ~' y8 t. P* _, u" ~& F+ noutput mcasp_aclkr," F8 V0 U4 H' T" q; ~
output axr1,
3 k: X7 j8 F7 R: ]2 l3 s2 @
assign mcasp_afsr = mcasp_afsx;
9 r9 |; H) Y, Vassign mcasp_aclkr = mcasp_aclkx;
3 p0 s% e- k' qassign mcasp_ahclkr = mcasp_ahclkx;
& j8 y! {# r7 `% U; rassign axr1 = axr0;
0 h! ]% k( N' h/ K( U9 n" y
5 o6 s. ^; Y, Z7 o% C在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
# Q0 D3 M ~% I }3 F, Qstatic void McASPI2SConfigure(void)8 h- a, I5 d; C( V4 b
{: [1 ^" x7 e. G! c: L
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
* \# l5 o* K! J* RMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */# i [ B: y6 z3 }1 N
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
0 e) p1 {/ M) v. u4 k; K* H9 F3 fMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */5 {2 f) V, Y; x' q' [, z% ?
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
: v. v7 r! H! o7 L; w& k: |" X; q# [MCASP_RX_MODE_DMA);) @7 w9 J, t2 B5 D3 a* E$ x& |' i& U
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' g7 [+ y# ?! v' M$ l( o2 Y& a
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */0 Q1 i, H) n0 ^5 r
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ; l( q% c* ~7 \- y
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);& C% A) b* _' b, B
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
- m) Y2 J, Q# V* B& V: P0 W/ QMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
- E2 @ j' a: I" L- x( BMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
, y7 h# E$ c- R, H9 N4 pMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
( Q e; m8 a. ~7 sMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,; z" N) O% r1 S+ d1 g" f: j
0x00, 0xFF);
/* configure the clock for transmitter */+ b# H& \3 X. w
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);. v: Q5 h( `7 G
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 5 e' f' @0 x- A" {
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
_9 H6 }- ]9 R) M4 y' H5 X0x00, 0xFF);
0 M$ _% c& m0 c2 k
$ ]- N7 D; ]6 ^; e1 @) K/* Enable synchronization of RX and TX sections */ . _5 A5 l( e6 a6 U; a
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */$ o e# F" X, c( E. w: N
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
# _) f0 d3 ~$ Q/ n3 F: RMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
& f& U' d2 p. Y5 ~** Set the serializers, Currently only one serializer is set as1 B$ q% h( K3 `1 B# H* q
** transmitter and one serializer as receiver.8 Y0 n. A: x2 }4 W( L
*/$ G* `: b% W* Y7 M2 m/ U
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
5 i* I* B% [# }' qMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
9 X9 A- v: D- W* V** Configure the McASP pins
& N& p8 A1 ?6 [** Input - Frame Sync, Clock and Serializer Rx+ ^) h9 Y- P q. a$ ~% ~
** Output - Serializer Tx is connected to the input of the codec
/ D" X' y/ q& n! {. k, H% |*/% y% |5 W# [) f* y" E
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
! c+ g# X1 e$ ~# ^8 j" KMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));4 d8 t i1 t8 y* P, z. C t
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
; a$ e1 n; D7 D6 r+ Y; [4 s| MCASP_PIN_ACLKX
4 V3 o/ n6 O% n2 }* U| MCASP_PIN_AHCLKX
7 F- z1 k s# I7 @$ n* J& S| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
5 i3 I% O; b" w; IMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 4 R- F- `2 R" m, `
| MCASP_TX_CLKFAIL
2 ]* @) `+ a* n5 d| MCASP_TX_SYNCERROR
. `3 h: t. |1 Y# I| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
& K. @/ m. E* L9 C| MCASP_RX_CLKFAIL' w& k& M! a1 s1 }- e0 k
| MCASP_RX_SYNCERROR 9 ]% ^ K6 S1 J0 ~, l) v- Q4 k
| MCASP_RX_OVERRUN);' W; n3 ~- G6 k% A# ], g
}
static void I2SDataTxRxActivate(void)5 {7 x; ~: `0 W) e, A6 H
{
( t9 y$ `8 ^4 ]6 {1 R2 H8 C/* Start the clocks */
# i" k* V; D5 aMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);( s9 R$ N% x: S
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
6 j" `" U& t% s4 {4 f" IEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,8 @; F( E4 J) k+ D+ `
EDMA3_TRIG_MODE_EVENT);
0 g& ?+ E* ^0 z7 G( {$ }EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
+ s) M$ x+ k* cEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers *// X8 L& c W+ @- C% u. {
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);8 y- a) c- q- Y1 | ?0 J
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
; ~; p J% k$ x& g9 L5 Gwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
. e, b- U8 b# y: P9 V4 p- q5 ^4 jMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);. ]- C _* b, N2 d1 v0 O4 r$ e
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
' ]! D s6 L+ E}
1 a- J/ ^/ U& R. q: ^( E2 ^请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
: m# ^8 L: @$ h1 C9 L5 C
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |