|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
3 q* [; F. z5 c& D0 a我是在DSP初始化这不太明白。2 P( }% e1 }/ r0 H. I! P( s
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
+ H% w+ B# Z% s! w) B% @, \$ m, [1 ?* g6 M! j* Z# }
# ^) l3 c0 V. i" b6 {0 J$ E
首先 PSCInit();//UART0使能8 ~. @+ y% ^+ E; C- Q
void PSCInit(void)
. k# f' u+ _) x2 a/ P/ ^( e4 ^9 m{
/ Q% G! d- S" B5 [+ M7 Y9 X4 g // 对相应外设模块的使能也可以在 BootLoader 中完成1 V5 W3 S) Y' h( `% s
// 使能 UART0 模块
, s' ~# V8 i; V: H/ m3 _ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
& D" x0 c( d5 V1 d4 N/ N; i7 ?6 l}4 d9 G) ^ S) r+ ^' o4 F* G
+ T( E5 ~6 _; i1 [1 A6 g% C) a( a* ?; o$ Q
然后是 双核通信的初始化 AppInit();+ C! u8 g, R: t" ?' D0 |! Y! z
void AppInit(void)$ z3 u+ D$ Q/ x
{
O2 [' _ l# _5 z' R$ ^/ S2 p /* Structure to initialize IPC (see Ipc.h for definitions) */
7 u. p, C6 q% g" i: G; Z: \ struct IPC_cfg ipcCfg = {
8 n1 K0 ~# ]6 H+ v IPC_DSP0, /* local processor Id */
& D- H, W9 F% y4 b IPC_ARM_HOST, /* remote processor Id */
' ?/ Z9 n3 J" |& ]( E" u2 u IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
$ p" E3 T# ^7 X& b5 @& I IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */. S+ {. L! \) E3 F q
NUM_MAX_EVENT, /* maximum number of events to be created */
/ e9 L6 v/ V$ l+ |" z, S/ B &ipcPvMemDsp, /* local side private IPC memory */' V: a3 D" f! Y1 V
&ipcPvMemArm /* remote side private IPC memory */" v8 y4 H6 s2 ^) J
};8 f1 r: A' V" x V$ t; v2 S3 @
IntDSPINTCInit();
b m: s8 a% k( [% R$ {6 H IPC_init(&ipcCfg);3 Y& }3 g5 p% C, X" n$ |8 P
IPC_intRegister(C674X_MASK_INT5);
( O! t9 w2 v+ U& Z [" o! a iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
) Y) g# ^/ C3 j/ \8 X" q, N5 r% E
* x; p1 } K. _4 x$ @8 B i4 `- d /* Enabling interrupts for DSP C674x CPU */5 k3 K3 v# L+ L) [1 m
IntGlobalEnable(); /* Enable C674x global interrupt */8 w0 p- h) I6 R5 ?
iAssert (Notify_start()); /* This will enable IPC interrupt */3 G& F4 A* b' Z+ }2 m$ g; C
}+ {2 X& @( X$ N/ N: H3 K4 H6 v# I ]
1 u1 m7 z' K/ @& w然后是 " P" D& g: O8 ?' `+ ^4 a: } q
// UART 初始化
6 L* r7 l# p8 |6 O5 U) |& a UARTInit();
" i$ R8 u n4 d5 `3 E4 S
! T% ^) _9 W7 ~. S+ ]' I // UART 中断初始化* Q7 B4 l. K0 ]- |6 K! S
UARTInterruptInit();
3 c$ |/ i- T3 b8 K" Y/ A4 Z4 \, ~: [6 C) C' `6 {! s- J
$ T( I! E0 h( E% \3 }3 S
void UARTInit(void)
6 s* z- y6 } e# t# p8 @$ \{- x" H. @7 x% \" Y
// 配置 UART0 参数5 X# {0 v3 Z i* {- m' p+ a- x
// 波特率 115200 数据位 8 停止位 1 无校验位
/ p. d$ E* \& W& a" i4 b# d9 H UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,/ d) O5 ]" O+ C3 @
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
; k; s; l! `, ? d. f6 \ // 使能 UART0
4 |& H. ] [0 X9 e) r. { UARTEnable(SOC_UART_0_REGS);+ ]- W8 q% ]( r2 B- R0 z& }
; Q2 q( z! L5 x$ s // 使能接收 / 发送 FIFO' m* u$ O5 g% ^0 n
// UARTFIFOEnable(SOC_UART_0_REGS);
9 \; |$ O. u! o; |& q! J/ f/ p6 d9 p# U
UARTFIFODisable(SOC_UART_0_REGS);
9 d' d# z) K9 [$ q3 H
5 q& k ^7 b0 }6 v7 O3 T // 设置 FIFO 级别 接收FIFO的级别
. Z0 d' V- ^# A# H: t+ x// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);4 q2 E! [' b) }& |
}! ^* s/ w* F; @7 q: \
- {; q0 \0 L. G5 ], Q* b' h8 h. o- s& B! F9 b
void UARTInterruptInit(void)# S7 [& l7 W* E1 s
{, `3 w7 D1 R0 S i% }- f
IntRegister(C674X_MASK_INT4, UARTIsr);( i3 V r- e/ Q$ v
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
9 F+ k* |: Q+ k) s- f IntEnable(C674X_MASK_INT4);
5 |; c& n7 J4 v& z* ^4 Y/ w6 ]0 [( H k2 G$ W& K7 x/ y
// 使能中断
H, {* q8 J$ W unsigned int intFlags = 0;% U; F2 k. H' R* E& y
intFlags |= (UART_INT_LINE_STAT | \( B! Z# l3 U) O# E6 h% C- V' ~
UART_INT_TX_EMPTY | \; Z9 K7 |+ V4 H( D) V. D
UART_INT_RXDATA_CTI);8 a' l2 i5 f, o! d% q$ J# {7 M6 e
UARTIntEnable(SOC_UART_0_REGS, intFlags);! A, ]$ v. `: j; `2 s/ u; X
}
- o& I5 m" {$ n( G, J E9 ?- Z( b# G3 N" ~
2 S4 h: F- m' F0 l& q; k
void UARTIsr()
- T, G% s! ?6 a& p: ?: D7 i' J' R{8 Z O$ W) }3 e
static unsigned int length = sizeof(txArray);
0 N) x- s4 `9 g8 `. T static unsigned int count = 0;9 g+ `% _& a5 v" }2 a& ?) e
unsigned int int_id = 0;9 M* c/ h9 Y3 N# A: e; s& a* F
" Q1 ^8 o& n# I% e1 C; ?! A+ D. M7 f$ I- U
, F. ]" z1 J! w# s, k
// 确定中断源
$ } N8 e2 x, r int_id = UARTIntStatus(SOC_UART_0_REGS);
' c5 E; _' f* C+ E' B3 f0 S" ^2 u0 J. s9 h2 y
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。8 [, x. o6 q0 y6 a/ ?7 b' u( Q8 n
' o$ |; `0 J1 J3 Q) G
6 @2 i9 t) f. ^9 s/ r // 清除 UART2 系统中断
' O T4 O- v7 @% n IntEventClear(SYS_INT_UART0_INT);+ p1 p5 e8 J7 @: U- l
3 h, ]' @2 f J6 M
// 发送中断& F+ K; M. z2 ]$ A, T" T* z
if(UART_INTID_TX_EMPTY == int_id)
+ A$ H4 _4 D: s) @2 X- k {
8 h5 X5 }( |6 I0 i if(0 < length)
+ _4 g3 ~, o' p2 P% f# P { D; o/ @; @# J* U* [2 u, @( k' X
// 写一个字节到 THR
( e1 Y/ M! _3 D6 a! [: }& }, o UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
# y& E; G# ^3 F3 ?+ R* M: c5 B length--;( P8 e m& m1 {( x
count++;
/ B4 ]/ ^7 `) {. X- k& P4 f }* g* P8 j% i `* M+ `2 G! ]# t% x( r
if(0 == length)
& m1 s% z4 C' B4 { c- N9 K {/ V: N2 s, d2 j; w
// 禁用发送中断
0 R" v% V0 a7 } G( _ UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
Z& B/ f! S5 f+ a. Z- c }; |1 i: Z( \' ~. S( h4 H* b
}3 _5 C. b) _: g/ O; q7 V+ F
0 x6 B4 ]% X( G5 {. V; V
// 接收中断
. T( }% r* Y u2 B. e if(UART_INTID_RX_DATA == int_id)
# f: G; ?6 Y( |8 {6 c. x {
) N- C2 j5 q; D. V5 K1 L" k' t/ }6 G if(status_a0==0)
0 R7 Z5 M6 v& T2 v7 }* n, W: Z1 b {
! ?( |5 M. _9 Q. N4 h, S a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
: _* \2 f2 [: w9 ^+ |9 Q if(a[0]=='#')
. N& u& F2 [- ^ {
- ?& U( g3 d9 e$ V* Y$ t2 F status_a0=0x01;* a* L# W9 U0 [" _) G+ @/ G/ r8 h
status_a1=0x01;8 a! g# E# Y" x/ Y
}
) g, V* m# c: J( M0 p }
; o! e& |" R& n d! ?( w" z if(status_a1==0x01)
# N4 x! }5 Q& e/ W, z+ ~( v$ X4 \/ c {
# s- v8 E& Y( [' ~: a! }# s! t, j a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
" W3 o' o2 x# Q7 P9 W& X" d, q if(a[1]=='R')
- P4 K) n/ @/ V( D {
% K* R7 _. q: i4 W4 Q; { T4 K status_a1=0;
/ a& d/ _2 H+ p) z. p1 n status_a2=0x01;; @7 o4 W8 ?4 P, u. V3 P- f/ X
}
6 x" Q# R- d4 h2 x# [, A9 Y, ? }+ J( ^4 [$ U( x3 ]9 }( L
if(status_a2==0x01)& i Y1 ]. W: T8 O# f
{5 n9 {0 O- w6 b+ A4 M- t b5 d
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);* Y) w4 a$ R0 V4 {. _, `/ s
if(a[2]=='A')$ ?: @% ?' `3 k( L
{8 S7 v$ K, P4 ]4 ~
status_a2=0;
; N: h/ i5 _* j( }! C status_a3=0x01;( a6 d) J G8 F3 O1 u
}7 X2 j2 Q' w& j2 L$ L
}
. f) X7 h! Z% j: S* n9 R# `6 ` if(status_a3==0x01)/ B/ H$ d3 I# C; l/ |5 k
{
: w9 ?- \9 P3 _4 N8 r6 c a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);& y& @/ t. {' d& g5 m
if(a[3]=='N')
8 D W' @; I2 c9 Z1 K {4 n6 ]* z8 S; E$ X. k' V4 K% ^( N
status_a3=0;
5 J7 b1 J' W i4 ^6 p" W status_a4=0x01;$ O5 g* z5 T! k3 H! @ n4 x7 q
}* I# F" z$ _6 H, i: d% Z+ g$ q
}4 S( Q0 n- D! t+ A: u7 C4 M9 O
if(status_a4==0x01)+ S2 X8 [+ L* d% z! n7 ?
{
$ V! ~* W" g4 N" m* M# M5 l a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);$ L6 ] M/ Z# s G2 [
if(a[4]=='G')8 {8 u3 u% H9 F# m, O+ R/ G7 C8 A
{$ z" w3 u( H9 W
status_a4=0;
- }0 o; m; F0 W' j8 i5 I& a. A8 s# A status_a5=0x01;
+ J7 w/ C7 ]) b/ c C }
8 l0 g! U2 B! f6 l. {. y }% f! h0 S* `: Z
if(status_a5==0x01)1 |6 q5 s3 X8 Z
{
" h7 F# B3 a7 } Y. E# n$ X a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
' |3 A/ ?6 i. v( c5 J4 C if(a[5]=='E')8 `2 }' @( v0 w4 g j C; U
{
, g2 p" G( }( c8 k status_a5=0;
5 U; e+ R; ^6 T# u8 | status_OK=0x01;
, R) T) ~% e7 ?6 F. p! _$ l }7 G# {9 I, X5 j" [/ K) z
}
/ B! b% Z& P1 }# D$ V2 F if(status_OK==0x01)- T+ ~2 w# Z3 J% o4 b
{3 d3 j7 v) N! C- {* K2 _% ^
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);. e( Q. O3 J' L/ }
lengthrx++;) b" P* M4 ]- g5 t
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)) p* f: e8 X: ^8 Z' a8 r: n, f+ `
{
/ b8 n+ E; T! {. c9 i RecState=0x01;# {- o' S% z/ ?1 H1 d. y) Y
}% _4 w) F% E$ p# X5 M1 q
}# e& p- D8 b. B+ l7 u: d! z
4 ]6 e1 U4 E% P
}7 x! U1 d1 `1 w% _. @
1 f, t0 ]# W2 C. S1 V // 接收错误
( ?: W/ p% @$ ]5 t if(UART_INTID_RX_LINE_STAT == int_id)/ d# k' K& `0 a% Y r
{
: ~ L* Z9 s* @+ A! E) v while(UARTRxErrorGet(SOC_UART_0_REGS))6 }+ N0 H5 Y1 E" g1 }
{$ y0 C/ C; _7 G3 ^' K
// 从 RBR 读一个字节
- F& e* _5 G, |9 k3 [ UARTCharGetNonBlocking(SOC_UART_0_REGS);
) l( S( B$ }/ s2 m1 x6 a }) s' u/ x6 e+ H5 W
}
! g% y. v: o) o, L) U" J) S$ e. C
# y4 f5 E7 u5 y% j, y return;# a2 t1 ^+ Z1 Y9 ?' u3 c6 N; Q
}9 f# d [: |8 V( K
3 K/ n! V- l7 m. K8 ~7 ?) I
; L/ ]' N2 @ |6 Q0 i% ^. Y& O) F" Y5 i
|
|