|
|
OMAPL138双核通信,现在需要DSP核中的UART0接口。$ _% f2 [" A) d* q
我是在DSP初始化这不太明白。
2 u$ K! e8 _" E7 r, S4 a$ l& |初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。. ^- n$ b# u6 n4 D* c0 v+ C
; h+ w' e) Q0 y2 s; ]- k, x& @
; n* D& F6 H3 X' a: E, W
首先 PSCInit();//UART0使能$ V$ ~* X" y6 w# Q
void PSCInit(void)
+ i( r G1 w- ^6 s/ `( @7 r( y2 V. t{
, G- y- \; e5 ?4 a4 ]# ?! { // 对相应外设模块的使能也可以在 BootLoader 中完成" z, {8 k$ f& N; h- q
// 使能 UART0 模块4 e& e$ R7 t1 p2 u- F
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);/ A0 @' _* K V$ z- ^/ {
}# i$ m, Z; e# N
1 @# G6 ^& o( @; ~, p( y! ^! o$ W. G) k7 u1 k
然后是 双核通信的初始化 AppInit();1 Y' g! n/ q8 d6 Y H+ K
void AppInit(void)
! D& H8 H6 B* P5 \- E, `{8 M9 q& y' H) n U! U( i# ]7 y' ~
/* Structure to initialize IPC (see Ipc.h for definitions) */
J: C1 T C6 p$ Z9 ~: I struct IPC_cfg ipcCfg = {
+ S( \) f* {: K9 [- u E& a IPC_DSP0, /* local processor Id */8 V& w* {( E f! U. ?
IPC_ARM_HOST, /* remote processor Id */# C1 N' U& |& S5 x
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
- n3 l! E9 H9 ? IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
; G: n+ R+ N% f/ _ NUM_MAX_EVENT, /* maximum number of events to be created */) c/ I7 [9 R5 A
&ipcPvMemDsp, /* local side private IPC memory */
& C* f1 W* e9 @# R &ipcPvMemArm /* remote side private IPC memory */
& `* M- N, I* ^) Q; K- P };
: {9 {' V( P9 b IntDSPINTCInit();
$ E9 L7 B! {* V$ F [7 j4 ?8 s IPC_init(&ipcCfg);
$ I1 e1 T% u( r. ^ {$ d/ Z* t IPC_intRegister(C674X_MASK_INT5);
0 K" p$ {1 f8 K& p. N* j. l iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
. O6 O! q" Q. N+ U- D
2 I& S3 c% U4 M4 E /* Enabling interrupts for DSP C674x CPU */
1 D+ Q7 \$ T$ o& g$ Y* s IntGlobalEnable(); /* Enable C674x global interrupt */5 F2 L+ D* Z+ }; E
iAssert (Notify_start()); /* This will enable IPC interrupt */3 L0 F/ C# v' f- v! c& ~' ]" u
}
% j5 U4 g" I. d0 r
* ? ~5 j( ]% i3 W" B, T) Z9 l然后是
. J9 _9 Y# ]3 M8 D5 j0 [* u) s) r // UART 初始化
5 j4 | B" m8 l& b4 I: ?9 k; `& O+ y UARTInit();' ]. u- b* |; _3 C& p( z( E% U1 v
0 W3 t# r2 y4 m% ?% r4 O // UART 中断初始化$ W, x' x. N! @/ w8 W. k9 l
UARTInterruptInit();
* h/ `, n' B, t. Z( l" L. ]6 R) M6 J+ O% G# k% g/ a$ S/ q' I: o
7 i' ?7 \/ ]' b- `1 y
void UARTInit(void); F) o: m/ f; H5 _8 f' C5 H( E- Y
{
' g- n- P- h- k h5 m // 配置 UART0 参数8 p, ~3 d0 ^9 L4 m. J6 g
// 波特率 115200 数据位 8 停止位 1 无校验位
$ \1 B% p. q" l UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
9 Q8 a& L4 l6 \6 L) O# d/ } UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
' c0 V) z$ P/ ?" w# S# c" b" `: k // 使能 UART0, C6 L% i, ~& u- X: v& ?" X
UARTEnable(SOC_UART_0_REGS);
2 w4 ^# y3 A( a
% B6 S7 d% a6 g // 使能接收 / 发送 FIFO
0 T6 {- v* i! v& |& c2 i/ r// UARTFIFOEnable(SOC_UART_0_REGS);
, _: x. M5 G A5 @: t
5 ~- \ ?6 ?2 a, o9 X$ m UARTFIFODisable(SOC_UART_0_REGS);
7 S7 n; j3 I7 Q+ Y M) c; j8 I* F
; I0 |1 Q" ?' i // 设置 FIFO 级别 接收FIFO的级别2 v9 P* i3 e3 Z& P
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
- p5 w9 W. Q; c/ _* s}
) ?+ j6 _# t+ j0 N6 t; J. z) T2 C3 ?& ^5 a1 q
4 ~4 s" x3 U) _" k" m7 {& l5 e1 Qvoid UARTInterruptInit(void)
# O( f5 J* u9 l8 O9 a5 c{
5 ^* n( q7 p( H* \2 K IntRegister(C674X_MASK_INT4, UARTIsr);3 p- l2 l3 L, {0 K
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
' L- W+ T5 S9 A0 a8 E' ]; X4 f IntEnable(C674X_MASK_INT4); N7 t" n1 y8 S# v Q
/ R. A! [8 m) b4 {7 Q1 Y // 使能中断
9 s8 n( H4 p$ j- X unsigned int intFlags = 0;' l7 B' ?; R" v. s( x. v" R
intFlags |= (UART_INT_LINE_STAT | \/ i2 @" [$ F) G/ D$ U
UART_INT_TX_EMPTY | \
* k; I* W8 p t: y6 j UART_INT_RXDATA_CTI);
, L a( | G4 y( y& z, r* N2 d UARTIntEnable(SOC_UART_0_REGS, intFlags);
0 k/ W9 O" V w! {! l! L}
. p; c3 ~7 z2 ]5 e+ d4 {8 w6 m- K
1 m# [1 ?" l1 q2 E7 }6 Q
) P) L1 B- {, Y1 l* b2 A4 E) svoid UARTIsr()4 B# [0 o8 l% T/ T
{
+ r+ W9 X7 `2 t+ T3 b( W static unsigned int length = sizeof(txArray);" k8 d& K' Q6 S, j
static unsigned int count = 0;- B8 f: o4 S% W
unsigned int int_id = 0;' x o( }, P+ l5 z5 H
0 A& M: y0 r5 y2 w% F3 }7 y( o8 p/ @# m$ ^3 p
9 R& h- s0 m# [1 ]" X8 G // 确定中断源# v* ~0 ?' B+ F j; k: C. o7 V
int_id = UARTIntStatus(SOC_UART_0_REGS);4 _( v5 g/ P: N! V; A
/ d/ ?0 o- K4 f# T n4 S$ e2 O" j- O // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
, q9 ~- X5 b5 t4 M
7 ?' N' Y, S+ _" e9 X' @' E' o$ m$ j* N) a6 C1 ]& a
// 清除 UART2 系统中断# n+ Z1 o) y5 W
IntEventClear(SYS_INT_UART0_INT);% _; q9 e' G+ t+ P: P7 x; ~
# S% P; ^ \$ s
// 发送中断8 O, D5 P. p6 D- S
if(UART_INTID_TX_EMPTY == int_id)1 \0 v8 E C8 I, t
{
, {+ D7 G4 \3 b) V8 E2 k/ b if(0 < length)5 c! k9 w/ g. U
{, r( U# v5 |5 a
// 写一个字节到 THR
$ j- l8 a/ X4 }: S UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
( [+ \: X! a1 [8 b" }7 w1 l) w length--;+ y4 g4 \/ z y1 M
count++;' U$ z: [2 a+ c) K, e: W% Y5 a$ v0 z
}- _$ V2 t1 o; B1 b' Z
if(0 == length)
6 z& \2 u) z6 c {
, {5 ]) [7 F" \ // 禁用发送中断
; ^: Z! l1 x& V- ^ UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);- F, g8 C7 v# W' [
}
/ j3 Y* R# M+ x; F }
& ]: N4 J: ?9 B6 x: {( ?/ c; F4 G) J: V
// 接收中断
% X4 z8 H4 ?! T0 a if(UART_INTID_RX_DATA == int_id)9 ~1 e8 e5 i5 i6 ^ O# Q
{" r# u" R. Q$ R, v- O6 |
if(status_a0==0)! b1 U. w. m: x2 K
{
m; z. |; b# p# B( q+ F a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
6 l# b" i7 s' t1 h0 f if(a[0]=='#')
/ O6 B7 n* d' a( c {
' b6 v2 V) t, z$ C' L' e status_a0=0x01;, \: c9 I- V6 ^2 ]+ ?1 z
status_a1=0x01;
% x3 Z) X9 c/ w# @" M3 o8 b1 v }
$ i, u2 p4 d6 ?4 Y( p5 j }9 p0 h4 Q N: @; n( A
if(status_a1==0x01)
, g9 \3 Q0 Q# \% u0 T) q {+ g4 E9 f! S$ @" ^% D, L
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
! z9 p' D6 O Z if(a[1]=='R')( `$ _% ] l* c. ]
{. Q1 A C( w7 Y: x, h5 C
status_a1=0;/ i+ K8 A$ C5 V) ?: K! C7 }
status_a2=0x01;
* A( ~$ Y+ y0 T7 }. g }
( g0 {. C# ^# T. @8 Q }
# X" Q7 y" y& u, j. L if(status_a2==0x01)
* m0 u4 |" j7 o {
3 Y2 z$ O8 f/ x; ~9 l, @ a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);' i/ t6 b0 H2 e/ R4 L" `8 P' V0 t
if(a[2]=='A')
# x- S! k8 o% e, W6 t G- V% v {
- L$ V/ r/ Z9 e! T$ y status_a2=0;
' x% ~. ^0 j/ @# d* A. a9 a1 x status_a3=0x01;- M6 L- d& G( r7 g9 h; V5 d9 W
}+ o+ g8 q9 {* ~) B7 F [4 n" a
}
* Y- W. s6 n' e7 \# u' P$ L if(status_a3==0x01)( a8 \1 U# \$ Q" h0 d
{' u6 V/ e& b; G q$ T
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
7 {! x$ u0 _8 w) }% M5 U. D if(a[3]=='N')
, ~& j( |4 U* W. \4 u3 {8 l {
l# k+ }( P( X0 W# _8 a) H status_a3=0;; v0 q" V( {) Q9 U0 x
status_a4=0x01;# a; U5 f1 R: @; Z# J
}; B* L9 U7 p$ m* ? a$ a9 ], X
}2 ` |. E0 i$ z1 p9 {, ]; U* T
if(status_a4==0x01)! r* I9 y9 o4 B/ o
{
3 w9 c' i% x4 V% A: g a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
2 j3 [& g7 q% d if(a[4]=='G')
A1 V2 k. E# x1 F1 w {
7 p. ~7 E( @7 K. n6 [; E, J status_a4=0;( s% D( l6 Q) G% b* @( }9 A
status_a5=0x01;3 w& J8 u$ G' x
}3 d8 n7 J! a X, k
}
; }) _1 D7 C, ^3 K( I& v if(status_a5==0x01)3 B1 s d+ @3 G: i4 p0 L$ D
{
/ P% j/ m, g ?3 O* y. y a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
& I3 C" d1 O8 y) p6 p" ] if(a[5]=='E')2 ?6 A: k6 _2 x/ ]) r0 Y% y' `
{( D, R; c. d( x2 v
status_a5=0;
8 H* C4 \& b- K status_OK=0x01;4 L2 ]% {/ A/ r) z' `
}
r9 S, v, O9 n. ] `& M }) w: r2 x/ e' S' Q( [
if(status_OK==0x01)6 {* E7 T/ k9 w. n; @8 F7 N" ^
{$ L9 @# s# ]& {' N5 u3 j3 a: m6 \
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
# g- J- H- f% N2 |/ l lengthrx++;
; u- U+ ~! {; o7 B5 @7 E7 \ if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
. w- V& X. o$ Q3 I" @ {
/ r0 }; e+ T S# k2 X5 n% K RecState=0x01; r8 [* b8 ?4 U; B
}
, S( B' w! m1 X! ^ u; G. `; \ }8 n& A4 V& |: }/ R+ z
0 F0 x3 V# g: ^* ], d5 J }# x3 C. y9 Y$ n9 D" I
) q% Z0 C3 o9 f) b // 接收错误( c- N+ b& b' n) G/ b# F1 E
if(UART_INTID_RX_LINE_STAT == int_id)
& q: }2 b5 d0 S6 H7 W; B5 A {, k# I, o0 D! u+ d# s
while(UARTRxErrorGet(SOC_UART_0_REGS))7 v: S' o' o9 M' \2 P+ \
{. P& I7 `7 A& o
// 从 RBR 读一个字节
2 y, D' p1 k- N* ^+ ?2 G1 E" g UARTCharGetNonBlocking(SOC_UART_0_REGS);$ C% {8 W, l$ W& {; J0 [! Q; w' _8 d
}
' g6 l, I2 p0 q }
8 r9 p" M1 e- K7 G# _! l8 V+ L, x9 v5 C, w/ d$ Z& Q8 Z* S
return;6 _+ w+ h7 a* {
}. W; S* m% X K! O2 ] K
7 D" G. N' |5 O0 s" }) ^" B# q
) Q# U& a4 R- e$ d W# t! M
" ~, m8 d9 |! H5 m: r- Q6 H" C |
|