|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
g- |6 ~- w8 Q5 @0 \我是在DSP初始化这不太明白。
/ p. R7 M4 Y6 ^+ M1 a. Q3 h9 ]) B初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。& z7 h: k0 |8 L0 r; O) X- h1 a; K
) m, u1 {# B8 z2 Z5 H% o% m
; a' s) q3 `4 V% T, Y' M首先 PSCInit();//UART0使能
' a8 `+ ?3 \8 A C: b+ pvoid PSCInit(void)& p4 o- |: l, t3 @4 t
{
) `$ v0 Z' |9 M3 n // 对相应外设模块的使能也可以在 BootLoader 中完成
8 p, b5 F' P$ H1 C( l; b5 [ // 使能 UART0 模块
- h: U$ [+ N$ I6 z+ y0 Z PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
6 M" B. `/ ~9 H. A}
6 E$ O' m0 G/ L- r+ P: C* g4 f1 v
( x$ X% g7 f- k9 L
然后是 双核通信的初始化 AppInit();
: ^& R5 w9 E. V3 i3 { H7 ?2 A+ p* Evoid AppInit(void)- d* J6 A" Z, m6 N1 M5 o
{
5 F( G: u9 Q+ Y/ x5 W /* Structure to initialize IPC (see Ipc.h for definitions) */
* R4 i* \ k& ^3 G! v struct IPC_cfg ipcCfg = {
3 Y) O* m+ w8 c& @$ m IPC_DSP0, /* local processor Id */* H) _! t+ N; C/ F( z$ g9 c
IPC_ARM_HOST, /* remote processor Id */
9 y: @7 e! P7 A. N3 L* W* E; M IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */) t- Z5 i$ x0 U5 V. B
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */: _6 r8 x2 a- P; ?% p
NUM_MAX_EVENT, /* maximum number of events to be created */4 A! L0 q& S% z9 `$ W
&ipcPvMemDsp, /* local side private IPC memory */
1 D2 D! {: \/ q) N! G, E3 f &ipcPvMemArm /* remote side private IPC memory */
/ |! t2 T9 f; j2 G" _. T };
' H6 p6 M' u% d- R! k IntDSPINTCInit();# s! b4 M1 S/ Y! v" Q# N, q) X1 {- W
IPC_init(&ipcCfg);$ l4 W9 `/ ], ~
IPC_intRegister(C674X_MASK_INT5);$ h. O7 V4 u0 m5 a9 L9 n3 H
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));. }- H9 H: ?; o4 C# I
. q, u& V7 I% n8 O. ^' J: t
/* Enabling interrupts for DSP C674x CPU */* ?" C( S: p& J, \$ ?
IntGlobalEnable(); /* Enable C674x global interrupt */. V; J% y% X2 p% K* e" m! X
iAssert (Notify_start()); /* This will enable IPC interrupt */
0 O( Z# [3 W4 h}
C5 P4 {2 q1 b
+ r e( f7 K% T7 Y% t' y然后是 & N! k9 P( q3 W( C% ^5 K
// UART 初始化
% E% g& B) d* A: D UARTInit();
8 S5 H& x/ e% k7 n$ v" S8 }+ P) s8 Q/ g7 t
// UART 中断初始化
# e+ K) G- |. }' @) ^! a UARTInterruptInit();
/ [% d& q0 l! {1 y
" v2 E) s+ T: u9 q$ }9 `. M- h) B1 y {
void UARTInit(void)+ a4 M# d! \9 |4 \2 S. x4 F
{
/ s) ~- ?5 P& ]8 y- y; z4 ^. h4 i: K // 配置 UART0 参数
; T9 g$ r: Z2 i/ H // 波特率 115200 数据位 8 停止位 1 无校验位
# h9 S8 g2 f9 }, o- R, f UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
. {* ?) g8 }/ ?. M% l1 E5 ^( n UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);. b8 J3 {* S( e
// 使能 UART0; _7 C" C! M- F9 B7 Y; v
UARTEnable(SOC_UART_0_REGS);
* Z2 x) Y' V: q+ f/ y2 Q; _/ O3 j4 @* g0 s3 }
// 使能接收 / 发送 FIFO
8 W2 ?1 b3 _( Q. N// UARTFIFOEnable(SOC_UART_0_REGS);
1 Y* n) N7 v I* \4 V0 L+ q1 ^# @( Y1 \* H5 P
UARTFIFODisable(SOC_UART_0_REGS);
/ M" T W' Q6 M; X& [" T( R" F, f1 k$ y& h2 r
// 设置 FIFO 级别 接收FIFO的级别
- I, x5 _0 ^0 o% m) z// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
1 ~) j8 U& l( k. `}
( m1 e$ Y% y& {8 [% G( e9 h
/ I, c/ A( q) M* r4 T3 n# a9 Y' U* x1 N6 V0 j) m
void UARTInterruptInit(void)9 p# a ]1 V4 x. Z0 |4 a& w
{9 u3 A9 a5 H2 q: C
IntRegister(C674X_MASK_INT4, UARTIsr);6 r& L. W1 }; G8 G7 g9 [8 R
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT); g% ?% L0 K: O0 m+ i
IntEnable(C674X_MASK_INT4);1 `" `& [+ G2 M
9 M4 P8 t5 q( _4 M* S; p8 d // 使能中断
' o1 @, \8 K7 k9 G unsigned int intFlags = 0;
% D3 e8 Q: o) _6 I1 s, N" `( F( k: G intFlags |= (UART_INT_LINE_STAT | \
; h' n! w, {7 @, D1 D UART_INT_TX_EMPTY | \
) j2 Y+ h. \1 `. b6 e& J0 w7 l UART_INT_RXDATA_CTI);4 r1 u7 \7 o. g$ `) K: r/ P
UARTIntEnable(SOC_UART_0_REGS, intFlags);
" N" j& j* {3 g6 k5 W! f}
5 l7 ?: P" N- N
! A( d5 U% K. Z( Z3 f: D% \- z5 _: P& z
void UARTIsr()% [! G; T( R7 s& r6 q, t& O8 B
{
" d( @" Q7 i* ^" s static unsigned int length = sizeof(txArray);; J$ l, T2 A* m, T; k. v
static unsigned int count = 0;. K3 Z/ Q( v: z
unsigned int int_id = 0;8 h) D5 j1 h( v U1 q6 D: w
" @: i2 M$ C& }/ [; n
$ s& J/ s5 o _6 S6 y8 M- S- r6 ?3 W3 `& v$ `8 { ]
// 确定中断源 s+ C# Y6 f+ N v4 v
int_id = UARTIntStatus(SOC_UART_0_REGS);& y1 w% w$ h w
' _% E4 } R5 f+ k // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
9 Q* J0 ]; I' t% Q3 O( O |, C: f
; u. b* ?" R1 D, r* }8 X" U& K: {7 }6 i& B0 ?
// 清除 UART2 系统中断
6 Z! ` n' e5 S: E IntEventClear(SYS_INT_UART0_INT);% ?) M8 C! h9 R& d
, @& B3 | @4 u! J6 m* V! P1 S // 发送中断! F5 P9 i; r9 c5 s3 n4 y6 h
if(UART_INTID_TX_EMPTY == int_id)4 R& c: d2 V) q) k4 L
{8 n B8 b' `5 Q+ ?* d: k. ~
if(0 < length)
+ W# w: h7 J% S9 l% q; e4 U {1 D9 s: |) X3 @; V8 f" E
// 写一个字节到 THR
[5 W* t3 Q/ i UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
: Z1 U2 F1 a0 W# p5 v length--;
* Z" s# P6 ]# v$ E1 q8 ]% c count++;! n* F& H; K2 e3 |$ o+ P2 `
}
# { N5 s/ G5 Z& d$ _, K# ^ if(0 == length)
7 b) l% V' ^* h, P {4 w1 `0 b5 w7 H/ m
// 禁用发送中断
* K% [5 A& w* t$ N& F UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
. b z" q/ n. i, H- B4 Q }
1 V( s: n" H w7 e" A }$ c8 n7 M8 J- s: A3 b+ ~
! U) x3 q' f+ Y9 M // 接收中断& L8 G9 |% m2 |9 F' T3 Q2 I+ n
if(UART_INTID_RX_DATA == int_id)2 e1 f5 ?1 M- T0 B$ _
{- F3 S1 E, U& q- O6 U9 l
if(status_a0==0)6 y$ L0 H6 ~% {; i- C! v
{: ?- d, P! \' L- M2 E
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
& i" \$ r: J% |& b if(a[0]=='#')
2 T& [) A8 t+ V* X {+ G. p7 z `) X
status_a0=0x01; U5 L3 {% k u/ P0 b; ^% B
status_a1=0x01;
) B2 f) N/ F! r }9 u" i U7 Z6 ]5 T8 _/ E" c# H7 ^
}. C6 w- ?- ]8 m# J7 K
if(status_a1==0x01) t: }7 o9 Z0 q+ v ]1 I& {8 D( m
{; n+ o0 c: e; ]
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);) v( u# `& B+ L! h+ P9 Z3 I; s
if(a[1]=='R')* q! Y" T) c2 t) m. [# h- u
{4 f* Y3 B" h0 p* B) O$ u9 m% I" {+ m
status_a1=0;* l5 m' H7 _7 p/ N T) ^2 P3 o5 t
status_a2=0x01;9 o7 V& ~& H0 z+ m
}
: l9 Y8 ^3 {) o3 F1 A* b* w$ i+ { }
8 U$ g; b: d% v4 h8 | if(status_a2==0x01)1 A/ S3 I3 V E: T& H! [5 b
{. ~" x/ D- M2 P) c
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);7 k3 ]: I9 l+ c5 \2 g& @
if(a[2]=='A')
: @% y" }5 j3 r; u7 {% ~/ t {
* S9 ^+ [( |) n! v status_a2=0;( P/ k& `" A: p/ j$ N7 w x
status_a3=0x01;. F! X) W' j& g
}3 A6 m/ f$ d2 g9 m7 y* R
}
- C8 A4 X( A: V5 N if(status_a3==0x01)/ T- R" P# d u9 }6 A6 o
{
7 P, }# R( X5 h* |$ R a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);" X+ t+ y) z* {3 o
if(a[3]=='N')
$ ]( U. S2 o6 U- t. _ {
$ {. @1 q( K! N( `3 U status_a3=0;# x f. y) b# k1 w% B3 ^& S; J
status_a4=0x01;
; X/ D" c! |5 f0 E* |+ T' }; P; H }4 I# Q& F+ e8 A4 M& M6 g
}
5 {9 k* H& ?3 Z- ]! J if(status_a4==0x01)
6 g6 S3 h9 L4 C. P0 ?3 k4 Z' ? {3 s e3 w. F# ^
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);4 a6 Y8 K7 ]- N: E* l8 C& K8 U
if(a[4]=='G')* O0 r+ [. f7 i8 V8 w
{
7 e, p6 D+ W: C, X: q9 { status_a4=0; o& W ]# s/ h" {
status_a5=0x01;
, B# A; p3 g" S% R$ m }
6 N4 L; `/ Z- y7 Q0 M- g( ?. @3 ` }
* h' G: r* S t* D; R) { if(status_a5==0x01)
( H& j1 y, a v$ w {
4 W& ?' o7 j1 U a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
' c' Z& o- V4 b. J, b& I if(a[5]=='E')
0 B6 i' F( \# J$ f- u/ j {* K# h* c8 { @8 c+ ~6 v
status_a5=0;# q$ b& C0 I, W; X
status_OK=0x01;, r; N, P: q) d# e0 O
}! B6 x' I$ J% N1 }( F9 ^
}' o0 D4 `& u% J0 B
if(status_OK==0x01)4 s0 C ?1 \$ X5 v6 @+ a! g ~+ B
{ r# q' [6 M2 X' m
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
, v" w' F: z& L3 H! w lengthrx++;! x7 }, b6 r1 H) L
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)5 N8 \) C6 \7 |& I& Q( Y
{9 P) g; `; a( e" F
RecState=0x01;
" b7 V$ Q6 s' s- u' { }1 R0 |! Z g% a
}
" B9 V, y P, [0 |0 s1 G' @* o2 y6 ], x$ g% V6 X
}
6 u- z( V6 w1 W8 @- }5 U
, R4 x1 b8 j2 ` // 接收错误
" G1 {4 G& d7 k- i0 }( W if(UART_INTID_RX_LINE_STAT == int_id)
5 ~% T- M' _4 M5 C! \ {
* B: Y: T. f2 H! m while(UARTRxErrorGet(SOC_UART_0_REGS))0 f; {5 w8 w/ ]" h2 M# P9 e
{ u$ h2 A) F1 j. \
// 从 RBR 读一个字节2 y- Q9 T7 V. ]' k! |8 h$ i, ^8 I
UARTCharGetNonBlocking(SOC_UART_0_REGS);
/ K# U' Y) ]7 R$ _; i) I2 ]- R: y U }. B* a6 @! t( ~
}, B4 ^$ l/ S1 T; M- m
+ e; M. {1 e @1 u9 E
return;
) g5 ~/ u, C. e8 Y0 X}' n2 A# j: V! X' I4 C7 w/ I; `& g
% ]3 F" ]& x1 `, ?' Y2 M2 j3 W
- q R- m, r# e) ~& B- {/ E0 A5 s7 V6 f+ N2 _' _7 P- g% P
|
|