|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
( y2 p) h6 N3 ^$ L" R我是在DSP初始化这不太明白。
' c4 S' F p) N* D2 T' C初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
7 u9 S# M2 P7 ]# i" N
: y8 @! ^" D& t. q$ L2 G% v2 S
. k! T2 X4 I% E. c6 Y首先 PSCInit();//UART0使能
( q4 x' X `9 R/ ]void PSCInit(void)
$ L4 C& c- Y" B2 u0 B& J7 H; k{
' `1 @- H; _6 \6 B& q // 对相应外设模块的使能也可以在 BootLoader 中完成
" P% E2 k" a7 c+ e$ o // 使能 UART0 模块
" I8 a4 m; N% P% }( C [0 ^ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);: g; M; Y. i8 W( C( v
}& ^5 s ?+ m; h! n
' R+ Z P) r. B: q" q/ p7 q+ a6 ]$ J0 J: z+ _ K" ^- m" P* a
然后是 双核通信的初始化 AppInit();
+ P K7 C; V' Bvoid AppInit(void) V6 b4 G- c. c5 Z
{
% h d& Z+ Q4 e; b /* Structure to initialize IPC (see Ipc.h for definitions) */8 X+ s! X! H h8 T; b5 N8 q( L) Q/ {
struct IPC_cfg ipcCfg = {
0 c3 L& u- p" W IPC_DSP0, /* local processor Id */& Z3 ^* J/ p: U! g( Y
IPC_ARM_HOST, /* remote processor Id */
5 w7 [, l( t. k, | P6 r; z IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
( ?' X# ^2 R' k6 m5 d8 v) _0 a IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */5 S1 o8 v& p+ a7 b3 \
NUM_MAX_EVENT, /* maximum number of events to be created */6 U0 v* T0 G+ w- o
&ipcPvMemDsp, /* local side private IPC memory */
) y, m6 m! N: o) [* T &ipcPvMemArm /* remote side private IPC memory */$ ~$ N9 s3 Y! X b
};
1 I6 T; O! ?4 e# e3 Q: Z IntDSPINTCInit();
3 M3 h, c K! n8 v5 B- I: d/ h) f IPC_init(&ipcCfg);4 N3 n7 F/ w% w
IPC_intRegister(C674X_MASK_INT5);6 @" s2 |( W3 i3 H
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
# K9 g8 H5 E" l* w' K4 e0 {
+ y2 }. d: j( j /* Enabling interrupts for DSP C674x CPU */; h2 t- |% n$ w4 ?! q) s
IntGlobalEnable(); /* Enable C674x global interrupt */* V; a) P6 ?9 V% g. ^+ J
iAssert (Notify_start()); /* This will enable IPC interrupt */
& M$ r( l0 _$ R) e: v}
/ l5 _1 z D5 A$ Z( l4 U' N
q" n) R# J( t" [# n$ ^然后是 $ x5 b* {. u4 D
// UART 初始化
* K$ ~; d' h, \7 m1 K: x' k UARTInit();
! @: s) Z% R. d) |/ l( }8 v7 j5 l' X6 [( U! c* D
// UART 中断初始化
5 ?' w; ^2 s9 Y8 L W1 v UARTInterruptInit();9 [4 ]+ h8 c( u i
, U* B$ L- g4 l
- N( c |( l1 V# s9 W8 n$ mvoid UARTInit(void)
7 n* l0 ^7 m8 P' u; L: K{$ h( R. C9 n0 n7 K( A
// 配置 UART0 参数 ?6 a7 q7 E2 [: F( h) e8 B* W
// 波特率 115200 数据位 8 停止位 1 无校验位
- Q/ ?4 F6 n; A0 u5 g UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,# f5 m+ j3 c& V$ J. `; f
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
5 r) ?8 L6 U$ ^8 W# }: @% ]5 \ // 使能 UART0
" [* a5 L! `- I* Y( p UARTEnable(SOC_UART_0_REGS);" C( I0 a. N( p3 D3 l7 ~
9 F$ W1 w+ u9 Z5 O8 w0 k5 X
// 使能接收 / 发送 FIFO
o0 h5 q% B$ s m' c" W// UARTFIFOEnable(SOC_UART_0_REGS);
" w7 A; N9 D6 t" a a! N% q0 X H6 A V8 d
UARTFIFODisable(SOC_UART_0_REGS);
6 `0 y: w) V, C2 |/ W6 `; K' B" }( T5 N' F' ]) r+ k/ o) O" F+ s
// 设置 FIFO 级别 接收FIFO的级别0 z3 p' V5 s+ z
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
2 V2 Y5 V7 o8 W- z8 E7 U$ w}" ]/ b' t+ \ F' z* C
! d( W( E; c4 s; l3 X# F+ h, N4 t: @ A! \! n2 _
void UARTInterruptInit(void)
/ t' I. N" U0 j+ b$ r) s3 J2 V: Y{* [3 e4 b5 w% B& l/ A
IntRegister(C674X_MASK_INT4, UARTIsr);
* `; ~+ D# ?/ z# i" J IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);: Z. T2 W7 m4 I* _1 l1 j$ ]& x
IntEnable(C674X_MASK_INT4);4 j6 G7 x) u- ?. U! V
9 I. H9 } [4 V( P
// 使能中断
/ I# v, _' w" I- [. y" v4 u5 ? unsigned int intFlags = 0;
. r: C/ f; r# o, ] intFlags |= (UART_INT_LINE_STAT | \
* c8 y) I" W5 o" A3 c9 M3 S: G UART_INT_TX_EMPTY | \
, e% s6 A# D; X/ W( A6 b- ` UART_INT_RXDATA_CTI);8 i8 E. Y8 p1 U5 a V
UARTIntEnable(SOC_UART_0_REGS, intFlags);
" V% j) ]+ ?/ W1 C}9 c, K/ R& O ?8 g. h0 g+ ~; N2 v
5 \+ a- o) C& V1 t5 V% I. J* c
, ?4 J: [5 |- E4 y/ l8 N I" Z
void UARTIsr()
, p: d6 S2 |3 I{
; s: ]6 o4 R# q4 o* @ [0 G static unsigned int length = sizeof(txArray);
/ @! ?- ^- o6 w& l static unsigned int count = 0;
' O3 u+ [; T! R9 i6 O( y( y unsigned int int_id = 0;! \. f3 [' O0 G' R1 d m/ V
" i; O2 v8 G9 g) @; g3 A+ I- J- o, t5 d/ m; Q; D% s5 s# {
$ S) b9 k0 f4 {, o9 h // 确定中断源0 v0 F1 g' H7 l% i6 @8 q1 P. v( e$ ?
int_id = UARTIntStatus(SOC_UART_0_REGS);, B8 m' i, `6 R( o/ _# l8 w
4 E6 x$ F1 Q3 {2 L I# R* L // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
3 U4 Q! I# z/ E* \7 _; I
9 N! W, m' v) ~) g% [/ i7 p) h6 H; J7 D+ B- _" R1 W0 t% r8 t1 E9 V8 g* h, }
// 清除 UART2 系统中断& H0 X8 k+ v1 ]- V- [- a& O
IntEventClear(SYS_INT_UART0_INT);# a/ P0 \1 \$ c- g% N$ O; [+ G, ^ w
0 k5 u7 l/ O0 j1 | // 发送中断8 r- ] O. R1 g5 e! M7 j0 q
if(UART_INTID_TX_EMPTY == int_id)
0 a% _2 ^$ B1 W; C0 \4 y! i {
}* r5 w. a, Y A9 L- a, H) F& f if(0 < length)7 K* H6 P' o4 j/ t# }
{
4 R8 I2 g3 V) u& a# G // 写一个字节到 THR; S/ n/ o# i5 B$ \, t
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);$ l" E/ B) `' R7 f" u& R2 w' C$ d
length--;
3 v8 Y/ s5 m$ h% d7 `: p& u Y count++;) W7 c9 p( y2 [; c! j l
}
6 n3 `1 @9 d# j1 o) ?% ?+ F if(0 == length)
4 N2 p) H1 d+ m( n {) H2 W* T! ~0 v9 \1 |5 {
// 禁用发送中断$ I7 B! S8 c+ n. R( |8 r
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);* t: {; W) z& O; N6 N7 ~, z
}
0 F& b! c3 |: o1 X/ y- O }
' ]: ?: ]3 S1 n8 H5 O- V% ]0 Z: F- T6 A$ @
// 接收中断" R* t* I, m& a) ~
if(UART_INTID_RX_DATA == int_id)
1 U0 ^+ Y6 Q) D f7 J# \$ h {
- _ |; V- t+ b- T% M! Z1 P" ~ if(status_a0==0)2 t# _. g! ?# X( c. @" `" Y
{
2 b7 G( y! o& {0 O" |! i& ~ a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);3 q6 d8 ^; t- n: g. d4 ^5 V
if(a[0]=='#'); n' R; F& m5 N" x
{) \6 s6 q9 {% O8 H
status_a0=0x01;$ u' ^! O4 j3 e, Y+ h5 l3 P
status_a1=0x01;5 \" c8 K# ~, t) S: z( f% y
}& `2 [/ Y) k! X
}" R8 `$ b& ?2 a3 c9 X
if(status_a1==0x01)$ m$ y5 T2 f1 W) z6 \6 d; m
{
; I8 v' V% _" v6 m% D6 } a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);8 V* N' n3 k$ C1 e
if(a[1]=='R')
4 @2 p, x! v+ b/ w9 } {! l/ @! | P w4 k: }4 q1 C5 Y6 a" y
status_a1=0;
% @; m: K) O( t" y7 e0 C3 Y, x" n status_a2=0x01;) b5 q0 z) q- p, T9 E8 P
}
$ [* _. t% h, j) X, P: C: | }/ W$ B0 Y3 \" p+ Z
if(status_a2==0x01)! Z! Q b& D w5 w1 W+ G
{' B O9 h3 j. Q8 d
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
4 S: M& h/ v" S( ~: J0 X, \ if(a[2]=='A'): n0 Z( s p4 Z) T
{
0 J$ V: T0 a, d; `* [. V3 C status_a2=0;
$ C, J& ]* g0 K. ]* r status_a3=0x01;4 ^0 h- L5 F1 l
}; d5 Z' f6 @/ R" c
} H; T7 g5 u3 g* F7 ^
if(status_a3==0x01)5 W( g- q! u; H
{
, e1 K2 S. Q P4 v3 B a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
% c t4 |' N/ m if(a[3]=='N')( a3 v ~" v+ f9 K8 |
{
8 N/ Y8 u- b, Y! v* Z status_a3=0;6 k+ n$ v8 J1 P9 {. X6 ]1 f+ l9 a
status_a4=0x01;
$ \5 A" E' C& s0 F$ W; v }+ d9 s Y$ ?+ m8 v0 o7 E% G% H
}
! G$ C$ h7 x* X/ W* ~5 u if(status_a4==0x01)
" u* _5 U* w. d* z3 X" c {
- J; Y z8 {6 \( R$ h a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);8 n6 T5 d' \1 E& t# J& z) E" J+ m" D) ?
if(a[4]=='G')
0 Y1 Q; b8 Q2 O; Q! V! g9 J, Y( | {; Y6 [& b) j7 U/ l
status_a4=0;
: A) g8 ?$ x( F2 P" F9 W6 e# M status_a5=0x01;
# U h! @5 O3 A9 P* @. `. d }
& a6 Z q& v8 |0 u; z. _+ M }# I! D( c6 Y: G* I0 e8 o
if(status_a5==0x01)
' B# s; U- ~! }% [& ? {1 W4 [4 |6 p: s) n. p
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
- c Y- _1 C/ `' F if(a[5]=='E')1 n4 y" G1 Z5 K/ R% ?
{2 p5 ^$ j8 ~1 ~/ o5 d
status_a5=0;
7 G& D* _* B! |& B6 T, \/ A status_OK=0x01;
8 c3 J& k* k, L! y+ j }3 j' q/ m) ~/ z k& a
}
2 |# N+ q. W! l6 F2 O( S. f" P0 R" i if(status_OK==0x01)
; {" T9 I9 a- q {6 V. j( G i3 F0 |4 U
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);; s7 j, v4 p& j3 U9 c- h* m
lengthrx++;
3 b; {+ ~9 w! L, I& V/ ?1 o b3 Y if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)) } {/ E- {0 z& U. T+ j$ r
{
+ P& W* A5 E7 c# Y: U5 z* u$ ~ RecState=0x01;
; G# W) H( H: q+ f }
& Q' a( U$ Y" I/ Z) E; } }& K' h9 _. f0 r& v8 a6 B+ ~) ?
/ ~) E& C" x& E* p' u }4 p4 _- E' z. B$ q$ |& \
$ ~" f, a4 T Z9 l a
// 接收错误
1 _/ P, q2 x/ s6 Z if(UART_INTID_RX_LINE_STAT == int_id)
% w8 o: S# _* q6 {1 R q% r {) f1 E0 i; [7 R
while(UARTRxErrorGet(SOC_UART_0_REGS))
) u) L4 B. Q: {/ E2 M {- S( s$ _6 M# i/ o
// 从 RBR 读一个字节, g# N. n% r, K; ?" ~
UARTCharGetNonBlocking(SOC_UART_0_REGS);
( C3 ~/ j' S A! q+ L3 ` _4 t, o }
5 u, z" S) U6 ~; U& c* u }5 \# A' b C6 g3 z9 N$ ?5 h
+ f( S$ L% u! A9 U0 }( f" u8 ] return;1 k! y7 |+ c7 B% }* U) b. c2 s' A1 b% Z
}
- o4 w5 i( U6 }
2 j' {( V6 F: q+ W3 `' k
4 f) b, o1 ]3 P( A
6 Z4 A# s: D: H0 Q# i6 C7 } |
|