|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
: Y' i- ?) ^1 x. U& F2 V我是在DSP初始化这不太明白。; W, j; C& R$ o
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
! a! J4 t! R7 S( K$ m
& n' i4 D7 a- E/ k
% F$ T/ ? R$ b( l( ?: l7 x首先 PSCInit();//UART0使能9 `/ t8 t; `8 g2 A( V8 z
void PSCInit(void)
) u, C9 y- o" n# _4 h{" M9 y8 c9 F+ U3 K$ c
// 对相应外设模块的使能也可以在 BootLoader 中完成: `" n5 l2 v( L* c
// 使能 UART0 模块
1 S4 e2 e0 A* g8 p1 b PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);% W7 s" J$ ~0 g. Q6 Q% S: J; q; z
}- c: I7 H; a4 G) ?
9 \8 B, x- l2 B# Z0 @1 i, {3 J) M1 q/ v' M+ _: F5 e
然后是 双核通信的初始化 AppInit();5 h4 G/ ~0 G: P$ }" \3 j4 r
void AppInit(void)! T% c! u W* r2 }
{) e4 m% `+ J( h6 ]1 t
/* Structure to initialize IPC (see Ipc.h for definitions) */
1 X3 I& N. J2 c4 P }+ \0 H2 b struct IPC_cfg ipcCfg = {
9 r5 r* q( a' ] IPC_DSP0, /* local processor Id */, y0 O! ^( l: w* p: g' D; h' h
IPC_ARM_HOST, /* remote processor Id */1 G. x8 o2 u/ D( f+ b4 ]$ m
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */8 X4 ?, o0 S7 ?7 ?3 G
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
, c4 r3 I1 u5 M' D NUM_MAX_EVENT, /* maximum number of events to be created */2 {5 o; `9 r c
&ipcPvMemDsp, /* local side private IPC memory */
$ }0 {, X3 M- @$ v &ipcPvMemArm /* remote side private IPC memory */
. i) F6 x G$ U. A& C };
& c9 F" |; v9 B$ w+ k; Q IntDSPINTCInit();
; E2 z, n/ o& c+ ~: ~/ } IPC_init(&ipcCfg);
) ?) F, F0 I0 w+ j5 G( p IPC_intRegister(C674X_MASK_INT5);
; f, @ S3 l4 I iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
: ~5 @% r& R0 o' G, j, y2 \" Z' |
/* Enabling interrupts for DSP C674x CPU */
0 X6 M0 U3 b( m IntGlobalEnable(); /* Enable C674x global interrupt */) b' l- C. C; j+ A% D( o
iAssert (Notify_start()); /* This will enable IPC interrupt */
% L7 h) @9 i8 A$ g. s' G [}, [( \" j0 y1 l) W w7 [
, L7 M/ P% h7 j
然后是
b! W3 F* F9 Q" g* e- y e: D // UART 初始化
9 |2 i1 j/ d4 T0 d9 R' Z UARTInit(); j1 k' W5 j& j" C. l
" q$ G9 X; i& L! J* \
// UART 中断初始化
5 Q7 @4 n i, X/ F. D4 c UARTInterruptInit();
+ {' ~7 l4 b1 Z5 L1 b- { r' ^2 I3 J; i9 o* d- j6 ?; ]+ i2 K, K! C! v; Y
2 Y1 P0 V$ M6 \5 ^3 K/ R# C
void UARTInit(void)
2 @$ k8 o+ }0 v{
K. N: I, d4 A4 k. [ // 配置 UART0 参数6 u' Z9 @: {( H5 `8 a
// 波特率 115200 数据位 8 停止位 1 无校验位
9 M2 ]$ L' R- ?9 W1 S UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
! b: o2 m- c6 I" k! p& p4 F UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
$ g4 U+ \4 g: v" T- y // 使能 UART0
0 i0 ]+ N _' [" h* f$ d& `# c UARTEnable(SOC_UART_0_REGS);9 g1 W3 A0 R0 W. O5 q
. x( o0 b9 p# _1 I% u // 使能接收 / 发送 FIFO5 G; D' P, f1 N" N, u/ ?; m# ]+ ^8 j
// UARTFIFOEnable(SOC_UART_0_REGS);( t7 `1 E' e' p O9 K2 ?" V5 W
" E8 O0 m9 N6 I. T' u UARTFIFODisable(SOC_UART_0_REGS);
8 R7 Y( o; s; m; A I8 O- {( S8 W" U8 J
// 设置 FIFO 级别 接收FIFO的级别
$ Z4 {& O! R. n) ^8 z// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
( \- b5 p; v% h( K" ?}
5 k Q$ q+ @8 H% C8 d; e% z# R; B0 h
/ V1 v# \6 a- M" [' U% d9 B% q- s0 y& O
void UARTInterruptInit(void)
# d8 R7 i. y; {/ I{
$ H; J% I4 W. k% b. W IntRegister(C674X_MASK_INT4, UARTIsr);
, M7 v2 }4 {6 s IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);% v" x8 ?' S# [1 B
IntEnable(C674X_MASK_INT4);1 p" H4 [! i$ s. y
* S. T9 M+ d U9 V+ b# a a# |
// 使能中断# L# h! v8 r3 W5 v( D% I3 i
unsigned int intFlags = 0;. M( a2 C( L# s1 @; c' m, X
intFlags |= (UART_INT_LINE_STAT | \6 Q# R' Q' L' e9 Y0 ^' C
UART_INT_TX_EMPTY | \2 @' C: L. } q. s% Q$ ^* o
UART_INT_RXDATA_CTI);
. n$ t' {7 o5 p+ } UARTIntEnable(SOC_UART_0_REGS, intFlags);
% N* u+ [' P( S$ h9 @}
' L6 b! [2 R( {0 b. g: s% j
% f% s$ _* O+ G2 p: W j& d5 |. c' }: r: a6 n
void UARTIsr()$ T0 Q; c7 l. [. n- c$ H7 _
{; C2 p2 N4 |) H
static unsigned int length = sizeof(txArray);5 U% W1 M1 d6 t5 K
static unsigned int count = 0;
" X ~, ~ ?6 j6 G9 U1 O unsigned int int_id = 0;
& Q6 a3 \! W" i2 @5 ^3 w+ ]) T% z# z
% a. Z. ]! {5 ]: X% k3 c
/ O9 \2 N/ }& H! C0 Q // 确定中断源
0 d* A4 t* M% X; \: {- g) a9 F2 z+ p int_id = UARTIntStatus(SOC_UART_0_REGS);$ R2 j9 ^: j9 M8 c9 U2 ?% z* l" f$ C
1 `. e7 t" T5 l& p$ G // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
; }# ~! y: B% H Z {
% S7 ]+ ^/ D% }& V' i6 d9 R9 p5 I1 t5 }
// 清除 UART2 系统中断
5 _6 a, c6 C. {. b7 ^/ k$ s, H IntEventClear(SYS_INT_UART0_INT);6 ~% D0 G8 d1 |7 v! @4 _& t$ X
7 A( {9 R$ w9 l
// 发送中断
8 S6 V, f/ y4 M/ K* c if(UART_INTID_TX_EMPTY == int_id)- ~, U5 v) L: G8 f5 K# f
{
- n- b7 U) n0 S8 `# c if(0 < length)+ z- u& U% o# P+ A3 U$ U8 F
{
) P7 Y" t; T5 O // 写一个字节到 THR2 a# I5 Z- U, \
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);# d. F8 v1 [: O8 V8 o9 n4 |/ t
length--;
) \" J: M5 ^9 _5 B7 P count++;7 p9 {8 B b/ X3 Z/ f! `/ D$ s& }% A9 W4 N
}
# B! C$ u* m: J& m, j7 h$ } {' L if(0 == length)+ e! w9 I7 }8 @
{% @: s* g! q$ A5 E4 @+ _! \
// 禁用发送中断- \5 M0 m# v& y7 i B9 m r4 G
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
4 F% {, _+ W% t' x) [2 n5 [ }8 B' \' h5 g+ K" X( x8 J5 b
}/ w5 k) v! V4 c2 S' Y
7 J; h7 Y$ W" w, a% i. z
// 接收中断
; O1 V$ \$ n/ B2 W if(UART_INTID_RX_DATA == int_id)4 r/ B s* k' l. w
{7 d2 ?) m! h0 S! d
if(status_a0==0)4 P `4 B; d$ r3 S9 j! y
{0 R1 ], H b9 T9 Y, ?7 X/ F6 n0 m
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
4 R; K1 i" n% {* m1 L7 B if(a[0]=='#')
m, b* c: I9 \& T# ] {5 x% w5 N ]0 M7 _7 f# W
status_a0=0x01;8 H O/ x5 F" \9 W9 w0 ?5 i6 a
status_a1=0x01;
( b3 q" j+ P7 L, } } A' [- _" I) S$ u$ E3 b" F7 X
}3 @/ s6 c, r; E) q; v U- x! }9 S
if(status_a1==0x01)6 ~) H z8 E$ \6 M$ o
{
; {9 t" @2 c0 _3 E5 I* ~ a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
% Y* j6 H3 o; I9 O if(a[1]=='R')
`" X6 M; g, N; l7 B, v; c {
/ Z7 b, C2 b0 b, X- B% `+ |. \) E! P status_a1=0;
5 c; o$ {5 s0 X. f2 W" B6 V status_a2=0x01;
# _' K5 Y1 ^7 h+ L @( y+ h$ M1 u m }
' k+ G" ^* M3 x1 u1 B- w }9 n3 O- s4 p8 r
if(status_a2==0x01)
4 j" P: w7 u8 g+ E: X$ U5 J {
, S0 W# L& n: Z9 ^/ @. ]/ k a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
" b' g, ^; v( c% ^/ l; W0 i if(a[2]=='A')
* {3 b, m# T4 L D: H {
- o3 h0 x- X) ^* S2 u status_a2=0;( ]" {' ` f* ~
status_a3=0x01;
( c3 z( c; c( P- w) Z) J' N, a0 Y# ^ }0 b& X5 a# {& F+ w% l+ j; U
}7 X* Y/ a; E3 O# s/ J/ u
if(status_a3==0x01)- t$ A7 O- j u" B
{6 z& C, I! m0 o* h# A5 j8 j! {
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS); ?/ }* O. q( e% N$ ^9 c- t0 _
if(a[3]=='N')3 [: o& n+ w3 b5 E5 ~/ N
{
9 I% g5 }' z+ E status_a3=0;7 [% _3 ] O9 G# O' o! x- G
status_a4=0x01;
2 J9 Y( [" R; |: i$ [& k' D# ` }* c4 I/ E# b- g, X S$ d7 O3 L! K
}6 k7 [$ y* c8 {
if(status_a4==0x01)
1 m$ B7 R8 ?- y {
, i/ a9 O: b! r( V$ s) d a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);5 g i5 F+ F# i4 @' P3 O
if(a[4]=='G'), `+ d9 B) H; o8 s9 k8 h4 t
{9 N- |3 U+ `1 F- k6 A+ P' d. h5 J
status_a4=0;" p7 K" L0 v) M* x2 g; m" Y7 E
status_a5=0x01;$ g" a# ]! j# R% b4 \) `0 j4 N. \
}
6 L. U4 H1 D2 Q, D }1 R" ]& e2 \3 }5 o2 Y
if(status_a5==0x01), ^0 E, T. {4 H1 r% O+ I+ n0 K
{
9 ]& H- u7 `; l( ?) q a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);1 j8 e* c% o7 j7 h
if(a[5]=='E')
( R+ p) @7 z7 [. ]" o {
" E9 }0 s# p5 e6 x8 \ status_a5=0;) o( s6 R. H7 k: f/ u4 n7 b" ]
status_OK=0x01;
4 Z# B+ p0 [7 n# o" a! d, ~ }. L/ T3 D. u5 a; l: x- u! d
}
- D& J7 u* R. q9 J, I if(status_OK==0x01)1 C- R6 g" Q/ }; U) s; M; A
{
3 G- Y$ W- r1 R( d8 y" |( X. {9 Y rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
$ q, W9 j7 P; K8 A3 L+ ~) Q lengthrx++;
4 m% T3 b2 [% x' {# B/ S if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)) j6 }6 _* S @5 Z o3 Y4 D3 B
{! |. {5 G7 O0 H+ H% Y
RecState=0x01;
5 s5 P' @( |; m3 F3 b" J9 T }% f2 [7 _: R2 C& }3 u5 [. L
}* p! C: {: c6 \) \; {) a6 p; u
3 i* M* v( e" B' d P
}
, w/ q* v3 p! ^! i- b8 |
+ p& N7 e5 w) H5 A6 i1 D @ // 接收错误
0 c6 W& L5 Q/ t9 S/ q% O6 |. r if(UART_INTID_RX_LINE_STAT == int_id)
) _/ \7 d q& i" |; m7 m% @ {/ \7 Y; @, e1 e; N
while(UARTRxErrorGet(SOC_UART_0_REGS)); o& j# Y, [1 ^0 H& X
{" ^- r' q. s1 D4 W3 L8 P' q
// 从 RBR 读一个字节
- G# D! l5 I/ ?% W2 z! r( r3 z UARTCharGetNonBlocking(SOC_UART_0_REGS);1 t' I- {6 x2 d* x0 T) L, U4 t! }
}( g& c% t9 ?0 i; n
}9 b/ e, p) A) Y& U1 w2 ]. `
; S# L5 n& F! q! o return;- @% v+ ]0 J$ o+ D9 u
}! Y. K4 Z- c; ~- G# p5 R
2 P; g' q: C* \/ H
! p! X: ]& W: j0 r- S& c! b
. W8 d7 E2 f* c9 }! e- E( `7 k! b |
|