|
|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
- V% M! M4 s: ^+ k" z我是在DSP初始化这不太明白。
) N6 S6 B7 A$ z/ q& i& ?: f初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。9 u0 V# l7 Z( t3 `3 b7 [: h
: M. H$ V3 ]$ Q1 Z7 y
( f/ A A: F; \: |首先 PSCInit();//UART0使能
& N2 A6 b8 p$ _2 z+ yvoid PSCInit(void)
- j' t) k3 ^- c/ Y( y{
+ u* |" ~0 {& K: \* d // 对相应外设模块的使能也可以在 BootLoader 中完成
$ A% U) f- i; f- w // 使能 UART0 模块* E6 |/ B! u; v7 S
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
+ j' p, V3 l$ y; k" T}0 m. C2 K8 A& O: `7 N! ~2 B
7 ^ c+ ~- U" V# C) |3 j+ Q8 Q: q, Q2 j6 E9 a! t
然后是 双核通信的初始化 AppInit();9 e0 J; ^$ i( \+ X: Q+ h
void AppInit(void)
; w5 W3 L+ m2 K5 q( S- ]{
& D( l8 Z4 n* Z N! l. w5 R /* Structure to initialize IPC (see Ipc.h for definitions) */
5 N- H) o1 J* D- i/ x" D$ p! v8 R struct IPC_cfg ipcCfg = {$ Z0 j {+ T8 R9 H# p
IPC_DSP0, /* local processor Id */
- b6 s6 u: [; D; [ IPC_ARM_HOST, /* remote processor Id */
+ y2 J/ ]1 i% x( T0 N& g) T' ?2 L IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */1 U. m; Z* }# F1 N
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */. L" j* n! k! f: g7 _& `
NUM_MAX_EVENT, /* maximum number of events to be created */
+ ?+ `* n" y, B4 I' _, S) E- s6 o &ipcPvMemDsp, /* local side private IPC memory */
2 I2 p+ I( \. s, {, }# g &ipcPvMemArm /* remote side private IPC memory */% t) c# B; x) _
};2 X% P, u; V7 b
IntDSPINTCInit();$ I+ K8 X2 y) g% B
IPC_init(&ipcCfg);
1 N% r7 D( S( i1 Q IPC_intRegister(C674X_MASK_INT5);, j4 Z5 F2 H+ Z" O
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
7 g- E6 u5 {; u" U6 N1 \2 I! k" T% F* U% P1 w$ O
/* Enabling interrupts for DSP C674x CPU */
/ V, A$ y6 `3 \ IntGlobalEnable(); /* Enable C674x global interrupt */1 U$ c. C9 ]* U; a
iAssert (Notify_start()); /* This will enable IPC interrupt */
6 d f) w% G. V a}
8 W, ^7 _ S+ K% j4 J1 u9 z, G* ^; ]3 ]% _% t" r
然后是 8 C$ I7 y' d. B( [' ]* k6 z- c$ p
// UART 初始化
" w6 u, ^( U& I8 k/ g UARTInit();) s1 _. [5 ~' t' n
+ N: u9 L4 o9 v E // UART 中断初始化' ]* u. E7 H4 p' n( m0 O; g! s
UARTInterruptInit();1 M* A- ]/ F' o; j- C8 s
$ @% f2 \) C) k6 T# z" J
) g$ S# ~5 K2 w2 L) @# I( ^. \void UARTInit(void)
# F% N: f# Z' i f9 R6 h{
% {- ^" t9 {! s0 @: B3 ? // 配置 UART0 参数3 A: v6 A# v2 s. G+ n
// 波特率 115200 数据位 8 停止位 1 无校验位+ k0 ]! f k# K
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
; V4 e1 Y; s% S* p UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
+ o: a+ D( M( Z h // 使能 UART0
- w9 k6 ^- Y* ~' n1 d0 e% Y; k UARTEnable(SOC_UART_0_REGS);
: }) I( Q) ~6 q3 f" a4 c$ \1 u
1 a8 y4 n2 X4 y4 _% s // 使能接收 / 发送 FIFO6 Q6 C8 u4 H% F0 |. V2 h
// UARTFIFOEnable(SOC_UART_0_REGS);
8 r% k1 h# X# n" o
% q+ C7 m/ g* n; u, F UARTFIFODisable(SOC_UART_0_REGS);! k: V" N6 M$ y! U1 T
8 ^, @, O7 e8 [* P* @$ p
// 设置 FIFO 级别 接收FIFO的级别
! G9 {5 @7 H6 D8 b5 `* j1 K// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
6 _5 j7 I+ y7 C0 ?}* Y, }3 E( X' J, P- `$ }: q1 @# i! z
8 S- a+ [ A3 B* Q) L
+ z) W6 r2 n4 w; J' ovoid UARTInterruptInit(void)
7 A! h% }; N( H, `3 ?; s{( \" n9 C/ L7 A9 `, e8 G5 Z
IntRegister(C674X_MASK_INT4, UARTIsr);: H+ A; O( Z$ c
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);3 J5 x/ q, X( ?# h! F
IntEnable(C674X_MASK_INT4);9 e1 x" X1 @) R- B' ~
9 ^1 a8 ]) r9 I" @( y- m8 e
// 使能中断
$ S; X1 K% R- z! o2 N9 M. G" O unsigned int intFlags = 0;0 c4 X1 X6 ]( m' E. x3 X6 l% Q u4 I
intFlags |= (UART_INT_LINE_STAT | \1 w: O# \, p4 m# g* C: U+ R
UART_INT_TX_EMPTY | \
, u9 A. E' q" g5 x UART_INT_RXDATA_CTI);7 Z0 G% U3 P& h
UARTIntEnable(SOC_UART_0_REGS, intFlags);
% \0 S. p$ a. p0 ^- H}
% q8 z9 _5 E2 n' b( Y0 \
8 _+ G& O- _* F% H- J* U
+ X% k1 h0 B4 G9 N3 o6 {. D0 |void UARTIsr()# ^; y- C6 V g) Y! R7 @
{
6 Q. |4 ^0 a2 ~8 ?8 `# { static unsigned int length = sizeof(txArray);/ Y' Y) w( Q2 \ q3 ^& l( f
static unsigned int count = 0;1 T" P1 N- m; E' i; {" C
unsigned int int_id = 0;" c( c/ G3 }; W/ Z5 U
F; c' M! h- Q
" }0 j* A% T4 ]0 V& q( S, _% e0 n
1 N# |) V8 D G1 S; \ // 确定中断源
* |5 i+ X# n, f4 @8 ]( S/ d% u) ^ int_id = UARTIntStatus(SOC_UART_0_REGS);
/ Y) M! K0 s/ X; t" f2 |/ P. U# T
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。5 h2 ~8 y8 N$ H) v; h: @
6 N! a' i, @3 v& X! M
' E m- S$ _6 I! H1 o // 清除 UART2 系统中断) U& D2 y) M% I
IntEventClear(SYS_INT_UART0_INT);
5 V% H( K* R, Q( W; X8 U
9 R9 {9 ?* v# M // 发送中断
6 z" ^1 F8 ^& i if(UART_INTID_TX_EMPTY == int_id)
2 ~: d5 U7 h4 p w+ u0 R {
& ?; J& U# m$ U6 u) V3 y6 r* w7 G if(0 < length)+ F) n0 ? C7 ^( Y$ |
{9 Y& @+ {" R( a3 k% J) k9 A" V
// 写一个字节到 THR
" j0 P5 f$ {3 B$ h: o UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);; p& q( k" i6 s5 {% c6 l
length--;6 J6 Y6 S- X8 k/ v6 ]( r [8 r
count++;+ V1 v# i. G" k- S7 C: l5 v8 S
}- T O+ q2 v) D0 |2 l
if(0 == length)9 p$ L5 Q/ c, g- R# {
{ G- i8 {6 `% y9 F, F& L; y& F
// 禁用发送中断' ]7 |1 G& y1 M/ t" F- z
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
2 E+ ?% @: J- m9 L" t* G }* q2 H$ @: V. e- p4 k; w. W6 L+ [
}& y* j) g# m2 T9 p/ v5 Q6 K
/ ?1 h; Y) A6 O6 N2 P! Q // 接收中断& C1 c+ E$ B- x, ~! r% T
if(UART_INTID_RX_DATA == int_id)
- I7 b3 ~' F- Z( p; V! D) T2 q {! x9 T: H: h+ X9 |6 [7 z# `5 q
if(status_a0==0)
8 ^! ^3 q6 o+ D7 s {) w; l2 Z+ m# Z7 s2 S V( y7 j
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);, |" B. F) H0 O: M% a% R6 g
if(a[0]=='#')
# q$ L7 S+ [; U* z+ f2 Z8 C1 i {
0 T5 ~& m! _, H status_a0=0x01;
0 v8 N" s. }, b status_a1=0x01;
$ d+ e& j# E6 k4 O4 R }9 i- ]! l/ J. `% j, S
}9 C' p. D$ {# o- U
if(status_a1==0x01)
8 v! ?( P+ X: w- E1 M& Q8 G+ x, q {
" P6 D* i3 {/ |9 | a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
b+ m" Z, b9 Y' q5 K: i" t) ? if(a[1]=='R')9 J& D: A* i- _+ D7 M
{
) f7 a; d8 K, P/ `1 n status_a1=0;! F8 N5 n& S& Q/ w' @
status_a2=0x01;
( j" o# t1 F5 B$ J4 V: N }
5 E9 ]5 {+ _2 P e/ X8 c" m! C }
- w' Y) ^) u( Z: L- ^; k if(status_a2==0x01)
8 ?7 u: Y! v' B( m {
$ H1 r- P3 w% G* t a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);3 E0 x7 u# j- o+ a O
if(a[2]=='A')7 u0 W3 C Y6 k& i8 M' `
{
; B5 @! V% {/ R7 A$ D status_a2=0;, E0 B% S. f# ?/ U
status_a3=0x01;
% M; B( o5 d$ ^( G/ W. g7 Z. s }
; x" V8 p9 ~0 N" K3 \% j; q }
1 l9 Z! W/ r# I/ [5 L0 P$ G/ C if(status_a3==0x01)
( W! z. s. B, ?; H/ [, r {
. \* w' Y: J' |0 p a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
- v2 C% V F+ \9 t# H2 X if(a[3]=='N')
; A- z5 c" W: {5 @% p {3 F- b8 D/ I0 n
status_a3=0;/ J2 S4 V0 f4 f4 X( X9 \; C7 b7 n/ d- h
status_a4=0x01;* M* [3 Q L1 ~5 y; Z, V
}
) B2 t8 U/ w0 | }
/ r0 k. U& u2 o. H/ P1 S0 } if(status_a4==0x01)
) ]' d; G3 A" k+ _9 V" g% b; Z' W {5 G [9 w6 A' Z
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);" Q m/ P. R8 ^
if(a[4]=='G')
/ E7 ?$ Y) a1 J, E2 D3 ^ {9 r8 D5 Q1 a0 I6 o. e) C
status_a4=0;* s& o: k& D! j8 k- P! z
status_a5=0x01;- G7 A8 c1 x7 A
}
& Q6 o# M7 o5 c) P" M/ E2 p. S4 F }0 \. B: U9 z7 V
if(status_a5==0x01)
6 w# U2 `3 Z( F {
5 D, O8 f$ b8 A! ] a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
p; ^6 ^" L- y( d6 t7 ~ if(a[5]=='E')
$ {. s% {5 f0 Y {- f$ b4 f7 ]1 N: p
status_a5=0;
/ M" u- ^! V6 P! Z, E4 } status_OK=0x01;3 @" O3 P- X# k" G( A3 o* z' m
}# ?4 v+ y( @( a+ X7 g
}
! I( c* ?$ V5 [. X) F if(status_OK==0x01)! ~' \: _; V$ U6 v
{
& I& n T p: e rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);* g0 F( d# v- l1 L; l4 e- ]6 w+ a
lengthrx++;
5 F/ q& `6 e) x2 v( k6 | if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)8 c9 A5 I' S& p5 T
{. v- k! d9 e$ U) o& f: g/ c
RecState=0x01;/ Y! p) v, c* W r7 S' F8 N/ D
}
6 p' A' N7 |6 G& ^" a }4 i; I( _2 r: G, D
. R. X" u3 x/ m, o# [ S$ f& F }
9 ^: d8 R: D; G. Z+ [
2 r- [$ l) s7 O$ m( k // 接收错误
1 K' W* c5 p% H d% J; C) h* h3 T if(UART_INTID_RX_LINE_STAT == int_id)
9 s' O+ ?4 f2 G2 [7 S ^( \ {' A2 q! J2 B9 P) `7 ^
while(UARTRxErrorGet(SOC_UART_0_REGS))+ z! I% x' {6 M0 t4 _( ]
{
* E- _ F" H" v, I3 {+ H // 从 RBR 读一个字节
]8 D( @8 U2 A UARTCharGetNonBlocking(SOC_UART_0_REGS);
$ d6 T5 J, D9 e2 m, b! I }
( K1 c, F) k4 x8 n* E8 n @ }
; _4 n7 v- ? W3 m; ]" u! |% r- G* d/ B$ [8 J' v+ B
return;
8 J% A0 R. }+ m( V}, l( D6 h$ \+ V) _. l
! ~3 V, s4 G2 Q0 X: R; K# c* R4 v% ]& I- Q
9 k0 c. e+ M2 y& E$ J/ J
|
|