|
OMAPL138双核通信,现在需要DSP核中的UART0接口。) w2 \; h) b+ T
我是在DSP初始化这不太明白。! H7 N" q! k5 A3 w
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
8 \/ K) T ]1 m: H. _4 x L2 A7 z& p6 F* t( }! p8 k3 E
( U% D) ? }- Y首先 PSCInit();//UART0使能
" l3 A6 W$ t+ ]7 ~) U9 Svoid PSCInit(void) R& u0 q5 `2 C4 f- ^& B# J
{" g2 a+ _0 Y. I1 K2 U( |
// 对相应外设模块的使能也可以在 BootLoader 中完成6 b4 E Q* }. A+ w
// 使能 UART0 模块
; f0 U. b0 A) J- E1 q+ _# X PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
$ q3 O& p; _! ^ \% u" g}
' `1 j: u/ D3 G* C+ `
# T6 y5 h1 M5 K1 P9 v; v
8 o6 |* Z/ R& _" f0 o( i6 I. O# |- a然后是 双核通信的初始化 AppInit();* a) R7 f9 C! u/ `7 A* E+ L. U
void AppInit(void)
' D8 P2 {) [1 D6 u- b9 u3 c{! d" x4 L# r- `% a' P8 a
/* Structure to initialize IPC (see Ipc.h for definitions) */0 D" f4 ?) P2 ^
struct IPC_cfg ipcCfg = {5 W& i8 E7 e/ h8 a5 a( ?
IPC_DSP0, /* local processor Id */
" [0 w3 h, o4 O# [* W, v. p IPC_ARM_HOST, /* remote processor Id */9 g# \3 S! `4 K% O) K6 X
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */2 a/ f' |- Z% r+ e; C
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */$ E# A( e# f0 W
NUM_MAX_EVENT, /* maximum number of events to be created */4 d7 N T# A. A% A( v
&ipcPvMemDsp, /* local side private IPC memory */( f+ _2 ?8 N) P
&ipcPvMemArm /* remote side private IPC memory */
3 O" b* k O; Q! l+ W. m }; O/ v8 E3 j. d f1 G* ?3 e
IntDSPINTCInit();
' e: X$ e, s& T# e( E0 j ~) ?/ x IPC_init(&ipcCfg);7 u7 o" A/ F5 j5 P# u; b% P
IPC_intRegister(C674X_MASK_INT5);4 a$ l; o9 X% d7 \# n& z
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));8 p- x0 S2 J2 K+ N1 _0 h- E
. y8 F6 v; @4 u* K3 |9 b7 t /* Enabling interrupts for DSP C674x CPU */
( n: l& J; ]1 H+ v! }( n: |9 `, D IntGlobalEnable(); /* Enable C674x global interrupt */
6 l7 {! K' x1 U9 ]: N, K5 W/ J% {; y iAssert (Notify_start()); /* This will enable IPC interrupt */& q6 d3 P3 N* |+ Z& K; {
}1 `0 X" n8 ^7 b$ Y# V
$ s Q; e, ?7 a+ e' l$ V2 l) j# K
然后是 # `8 f- N9 d+ l
// UART 初始化- X- w6 A- Z1 }: k) p; a1 k8 N1 j
UARTInit();
4 P- ^5 l: h, t6 t
( h$ V$ R: F' Y) a8 B3 ? // UART 中断初始化
7 U7 I* V3 X5 E( H1 i; c: D# S, _ UARTInterruptInit();
( a7 X; y+ r( k: d
+ ?2 L: m# E1 d: j2 t
5 D; e2 G( R- t! ~void UARTInit(void); F) ]6 z- y1 a
{
: W1 s" B! w& _$ L& U // 配置 UART0 参数
5 f3 c% I+ a% ?/ O // 波特率 115200 数据位 8 停止位 1 无校验位
y1 w4 j8 I" @ UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,9 }0 W7 s5 F3 x, G: o; v, H$ u" X
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
' h* v$ c& L7 Z5 [1 Z // 使能 UART06 o f' b6 D; N2 |, t: L T+ d
UARTEnable(SOC_UART_0_REGS);
! X# J; q6 K5 L! v; y4 [1 Y+ h- w: {& ~# I
// 使能接收 / 发送 FIFO
5 D1 a* R! P/ F- V1 V {& t// UARTFIFOEnable(SOC_UART_0_REGS);
! h& M l! P" c2 g4 U2 x8 }0 e6 w+ O" E, X3 i4 T
UARTFIFODisable(SOC_UART_0_REGS);
) t: }6 t1 S4 U B+ D1 C; ?9 F0 t7 ?* b7 R" W7 p6 E
// 设置 FIFO 级别 接收FIFO的级别
% J& [. X- b$ R: e// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);. {3 b Z/ ]. g/ b7 {
}' L/ ~' q4 z6 p+ _
1 {) _. |! d) s5 X; L! l3 s6 t9 R1 s8 N2 o/ Q$ n$ _
void UARTInterruptInit(void)# l5 s- p- v* V8 o
{
) e# ?/ e6 M+ \! M1 l6 s IntRegister(C674X_MASK_INT4, UARTIsr);( A8 b: t# E1 j! ^6 [& z
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
( w& y' X1 F0 i IntEnable(C674X_MASK_INT4);
: w4 ~, @+ v. |& F( U, s" w; l0 X" k% w4 O9 B, L1 B0 U! \
// 使能中断6 j- s, ~; C; `: S* U
unsigned int intFlags = 0;
! H+ G. K8 G1 Y6 B0 g- \; ]8 c intFlags |= (UART_INT_LINE_STAT | \; `5 b4 U8 l# _6 E: a$ N9 L
UART_INT_TX_EMPTY | \
- i4 i( d" B4 L- l+ s+ x- m UART_INT_RXDATA_CTI);- S O% [* @2 {, \# x' L' K- h
UARTIntEnable(SOC_UART_0_REGS, intFlags);
- `& C! n# |6 a7 E( I) L+ \- K}
& E' }% Y3 V0 k4 `
2 D6 t; P a! P+ }+ f. i( n, Q& Y6 _5 q& y* x) J
void UARTIsr()4 x! E; |: x7 P S* ^; O
{. \; h9 k3 v" u2 m
static unsigned int length = sizeof(txArray);
. a, _1 M% t# P3 ] static unsigned int count = 0;
; ^* z$ [4 x y X2 g! c @ H unsigned int int_id = 0;1 H# X- c! r' k5 s* K
* O# k6 t1 \/ w9 a- `) Q: z# X6 ^$ I* e% o# u
, `0 a3 T' @# K8 M& Y% S) U! F
// 确定中断源
& N( }' B# z2 S% k; j$ C2 A# ~& e8 h! m int_id = UARTIntStatus(SOC_UART_0_REGS);
9 K+ C; r- ^( m! X% a
+ A* P" F$ y" U/ F9 N7 a7 r // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
* K1 N9 h$ {: M" N% f& {* r5 w. ]
* K5 V4 u# Q6 U: z
// 清除 UART2 系统中断
3 B( ]+ E; r8 x G! E IntEventClear(SYS_INT_UART0_INT);
, H9 ]+ V6 C! K* C+ K2 ^
2 c1 D- L$ }/ f! H1 C+ x4 ]! Y. Q // 发送中断
2 f) W$ Y4 B; S4 N3 F" w" Y if(UART_INTID_TX_EMPTY == int_id)
1 u" l) n& o [ {
4 _1 z5 o% {. f if(0 < length)* `8 Y' [5 L; {! R
{4 F4 J# ]2 Y' o* S2 [- k1 U
// 写一个字节到 THR
, D/ E3 W2 @% l9 U+ Q7 w- M UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);. }' K8 i T: K( O$ K% d
length--;( L. }* y6 K6 `: b$ h! i( ~% z0 s
count++;% J2 e3 b0 C. |* w
}/ U; J% O6 B- |: e% V
if(0 == length)9 U5 {9 k) H1 y4 X/ L
{2 M9 f3 n" s4 |) Y
// 禁用发送中断
" K7 g" t+ V, S. I/ D UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);$ ?+ D4 d- X: e) F( W; S
}
3 i7 N& d) w \; p: p0 i }5 \8 a% W: E0 @/ M( W) E# D9 j
2 M0 O4 _' ~# Y, {' q // 接收中断
\6 u v# T: l) i if(UART_INTID_RX_DATA == int_id); H3 J2 o. ?- T( G- A
{$ C. y% Q& B+ m) ^# E
if(status_a0==0)# O: l! P0 o1 n' r& {- j9 x
{8 j+ b% B3 X+ k- Y$ Y5 K) i* ~
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
# J' V; g& S% ?5 Z. d, X if(a[0]=='#')
8 ?5 n, U/ b1 d( ^5 I {
% Q+ y8 }$ _9 G+ T# d- E* L$ Z3 ` status_a0=0x01;
' P$ m3 w2 z {- E! C+ C status_a1=0x01;, |. J' @+ a5 n8 w" M! v1 a
}
& f4 W) W$ w9 a$ _* o }- e" |: C# G( B; k2 Q
if(status_a1==0x01)% z$ } |5 f+ y5 l/ V' C: f
{
2 ?. s7 r: E' M, {' G a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
- t& ~' g+ p( L' }: `+ P, d+ ]! \ if(a[1]=='R')6 A2 [9 s4 u/ u, v( ^! f
{& S4 k3 J: z+ q- z* K# i
status_a1=0;
# S: {1 M% h2 h" d+ M; j status_a2=0x01;
4 z( C" X" ~1 W# d# v- e }8 [7 j$ {$ {! D. J# ^ ]
}' W, |' }2 E, b2 D$ D
if(status_a2==0x01); {5 u# c' I1 J5 R7 e
{6 x% t2 U3 E: V% Q2 @, i
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
' v; Y Y( |0 `& P" s. G if(a[2]=='A')
2 P( O/ w9 d- h3 H& H. N/ @; o4 J {
/ B. [9 U2 Z' g% K status_a2=0;
6 J$ U" T r& c" H% W: b status_a3=0x01;$ f: O" [1 W% g7 k! e" G
}
( Q! J* J! f4 F8 B3 T) C }
' X% p" W V# e1 O4 V4 i if(status_a3==0x01)
2 j- X% e' j" o3 f {1 E4 N/ v' Z6 s+ L0 r% m9 _
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
( ?- s" i6 J6 O. A$ L+ v if(a[3]=='N')
2 w( L! H$ @: ] {
" i. W1 M1 i, p" ^% L: Q `' |; @ status_a3=0;/ L8 L4 ?) v r" g6 w
status_a4=0x01;% `: C2 l- T! S
}
" o: Q# Z8 l" `# I# |" k2 @) C }' c1 }! D; m% V! X- ^. R0 i+ k
if(status_a4==0x01)* B; G; |9 g! T1 U$ d0 z: X* B% q
{' z5 _; V% B6 `; V1 m$ H# ?; [* c
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);; g2 ~8 r$ i/ B+ r, F. d& w8 K- ~
if(a[4]=='G')+ V, W5 _) F; V3 a
{, l, a/ F0 V5 ^5 u& [) S
status_a4=0;9 U" ?0 j# Z" N
status_a5=0x01;1 ^: t: _3 s) y
}
) [3 }$ c, q2 l( J5 ~+ x }
: R* v" o2 ~; ~! L) h! Z: c, }1 k if(status_a5==0x01)
5 ~ K! q! {0 W2 c0 E {
, E& p0 ]; L8 `' H/ N3 {( W# X, y4 A a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);$ N- z/ a& B. d
if(a[5]=='E')/ E+ [/ c8 I1 N( s
{
( s \" v9 O) d7 }' r( l status_a5=0;
; \ u$ t8 F3 _( s, y: L6 b status_OK=0x01;
1 ?( S9 k" F" c }/ A$ M/ H+ R# `) C
}
f. p7 Z; `3 F: U if(status_OK==0x01)- h% l6 K4 r3 ]
{) H3 L) A7 L; n, u. E5 B
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
4 M) c, v+ c4 t, w, G5 P/ o6 M; M* [ lengthrx++;6 L( w1 B) Y) e# {1 S$ I! ?* t/ \
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
$ U( n+ Y' g5 O* k2 }7 S4 k { R8 L/ o3 ~ R1 H: b
RecState=0x01;$ `1 w1 @( i6 V( S5 l
}5 \) ?4 O8 x) f! s% h
}0 Q0 D) c0 I( e6 ]
" u2 d' m9 V/ s/ P }
6 d8 i" I0 o) k
- K: v0 L. F! q3 D // 接收错误+ J7 J& w6 |, q. F; i9 e/ g. f
if(UART_INTID_RX_LINE_STAT == int_id)$ S2 |" \/ }# Q0 K
{3 ?! e0 Z0 q/ i" U' P5 u. f
while(UARTRxErrorGet(SOC_UART_0_REGS))( N5 s7 R m; N7 p# @! I0 L- y
{
) t# Z9 }) O; [9 R' r$ {- G // 从 RBR 读一个字节
6 [- h" O1 u7 d" v- L UARTCharGetNonBlocking(SOC_UART_0_REGS);% F" S3 b, x( ]
}
7 G) a9 h2 s5 L7 u }
* c6 g$ X( e( _6 b* @
, z* g1 n2 p8 H; C( y$ j6 Q2 N9 ? return;- k% {8 k a8 ?* X3 a1 ~
}7 @- K/ U- W% {; E5 v' E
) d: z4 `' H2 {& X7 g& F- U
5 O6 Q; i8 v% v4 ]9 ^4 |% }4 `- m6 w/ {+ v) k/ }$ ]$ Y" J+ @8 @3 {6 `
|
|