|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
% ]+ e r" ~# R$ J0 h/ R我是在DSP初始化这不太明白。
, J" i% X8 F/ J R' x% | I初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。- z# ]0 g1 G/ G4 V: u! g" m
! v: k! O& X/ m4 Q3 r
- o7 H9 k7 Q& l0 B首先 PSCInit();//UART0使能1 O7 I" K$ s v. L; ^
void PSCInit(void)
. z9 C$ i# q r% g{
, ]$ ^& U, @4 j4 n9 n# b- g // 对相应外设模块的使能也可以在 BootLoader 中完成/ \6 H! j0 c5 H& Y
// 使能 UART0 模块
& Y$ z. N2 P1 N1 l PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);, H+ p$ l3 c8 ~% X1 o; G T* o
}$ k a: G: u! M% u) R/ ^% [
8 S9 o4 m" Q( a; v" p& X4 z/ z% O& h1 \$ [$ d( ^
然后是 双核通信的初始化 AppInit();) Z6 _7 {5 P+ x- Q: K u! |
void AppInit(void)
5 n. V4 P; O1 J* p! E" T{! J, E3 `+ T* c
/* Structure to initialize IPC (see Ipc.h for definitions) */
6 _9 J) @& S* K7 D) a5 ~' E struct IPC_cfg ipcCfg = {
3 }, b, o( c/ p# C IPC_DSP0, /* local processor Id */8 T6 M6 j! I. z: E% j- H* z: R
IPC_ARM_HOST, /* remote processor Id */
# R% J$ X7 `7 W0 o6 P O' b IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
8 T0 |, r, d& t* k0 t! U IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */- k' _6 X1 |# K4 F& m4 x/ H
NUM_MAX_EVENT, /* maximum number of events to be created */5 G/ B. J% w }8 z( }9 `; m( C. i
&ipcPvMemDsp, /* local side private IPC memory */
4 [4 P6 y; m+ |0 a &ipcPvMemArm /* remote side private IPC memory */
3 ~! U D8 s0 m7 H d };
! `7 F i B( }1 ?4 j/ ` IntDSPINTCInit();! F" U1 r8 U/ v( c) U- n t6 O2 J7 c
IPC_init(&ipcCfg);
; Z H. Z8 Z$ ]% |# @ IPC_intRegister(C674X_MASK_INT5);
$ C' G0 }) A: X iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
6 J M; a/ q5 F8 V
, k: b3 L. O! Y U0 F1 `: k /* Enabling interrupts for DSP C674x CPU */
* C* M" S$ s6 L/ f9 q) x( J5 ]) J& P IntGlobalEnable(); /* Enable C674x global interrupt */; }& q- q/ U) d S5 b
iAssert (Notify_start()); /* This will enable IPC interrupt */. G" Z# h3 t% Y
}
# b! j$ M# J- Y h6 h1 n* C- g' v
$ m2 w/ n( k4 B0 A0 I7 Q. B- F然后是 % Q$ e# B" |7 Z3 \
// UART 初始化1 e6 P! s( f- d' {1 h$ o- o
UARTInit();
& e/ ]: B. W! ~5 m
4 j8 N7 ?; ?# E* ^( f! p0 n9 y/ L+ x // UART 中断初始化' M( M4 t9 t5 U% r
UARTInterruptInit();
9 @; J) z# [1 ~' k( t N# v% h+ q* W! b; c. A/ J. d8 R0 O
# U0 r6 D% Z4 |2 ~* z& bvoid UARTInit(void); H+ N! ]2 s' C# Y6 E
{( E( h9 ~3 y) w2 E
// 配置 UART0 参数) g, h: e1 f2 W' n
// 波特率 115200 数据位 8 停止位 1 无校验位
% ~* W' D+ a$ K, I% }* l UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,% L' v6 L3 @8 B: G5 M; ]/ o0 `% u* z
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
. L: S1 B/ B& X6 x // 使能 UART0$ ]9 n2 ~$ C6 G4 y. w
UARTEnable(SOC_UART_0_REGS);
$ {6 @' M/ j' i& x8 _& M( h) {1 d# I; E
// 使能接收 / 发送 FIFO4 j; Y4 g4 {1 W! P, F( O7 I K' Z
// UARTFIFOEnable(SOC_UART_0_REGS);8 O. }1 y/ M' d7 h0 y
1 u- q# e) [( t+ x1 f0 D |
UARTFIFODisable(SOC_UART_0_REGS);
. e9 K; e) M H: }4 g$ B1 E& G
+ B4 @" W6 b, S! U4 A // 设置 FIFO 级别 接收FIFO的级别
; X; Z; \& t: [4 d; n: }6 y5 i' C1 W// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);, W+ x/ P: g/ o6 ~+ c F
}
. z% e- z9 D# @+ p7 R7 [2 A n3 k( e1 |" Z9 \! l, @% f# b* v0 M
2 ]+ \* A; A+ H$ {: B0 ]5 \void UARTInterruptInit(void)
# |/ {$ \9 a0 a* E) b{* \+ p9 c" r0 g6 I: ~
IntRegister(C674X_MASK_INT4, UARTIsr);
( r7 A- L0 ~ r$ a3 B. Z IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
% t5 O9 V/ ?/ R, h IntEnable(C674X_MASK_INT4);
8 D9 K% {, q \% x) y( b$ C: ?* Q e$ h" t/ r# o3 W# I; V
// 使能中断
; u3 ?- q- a* O7 c& ` unsigned int intFlags = 0;) S! z+ U2 `; P
intFlags |= (UART_INT_LINE_STAT | \( v3 L/ |3 G' N- _
UART_INT_TX_EMPTY | \
( d( l4 Q8 Y. \% v1 s/ Q! c UART_INT_RXDATA_CTI);) G' e% w6 y: k! q' c0 n. `2 q. |
UARTIntEnable(SOC_UART_0_REGS, intFlags);
. K% Z4 A" D4 S# d* E' e; _}
' \' x/ x- ?: U+ Z7 t5 ^
: k* h. J5 H1 M" H- W9 l: \
+ {% g4 b/ r# ?" Y/ x$ Kvoid UARTIsr()
7 @5 o8 ]- l9 l7 y) a{
- }$ p1 j2 u8 z# H+ A static unsigned int length = sizeof(txArray);0 }9 o4 w! D( N% i
static unsigned int count = 0;
& O% L/ X: g1 S* w+ W, E8 _ unsigned int int_id = 0;
~" w1 b8 U% b' g$ Z5 C0 ] {; z4 M: _4 r0 M) i; A
" E, X& i, u* S; l0 x. z" U2 y( g
+ U+ A! t0 X* C6 m, R! ] // 确定中断源
5 I! c5 I: }" L, a0 Z int_id = UARTIntStatus(SOC_UART_0_REGS);) ?. b9 t7 ^. H u" J/ w
7 w# m8 k" S- n( [2 c
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。; J3 [7 v r! c$ d( j$ R7 [( Z
$ o, `" I( ]/ x4 |" v; t
+ y) d" S$ r! e: G2 I1 @& m* m- E
// 清除 UART2 系统中断0 t. b/ a1 e( _
IntEventClear(SYS_INT_UART0_INT);; i6 u. _" ~% G7 H7 R1 ]$ ^- T( V
9 e: l4 ~5 P0 r5 @
// 发送中断4 N% |$ Z' k, Y) O
if(UART_INTID_TX_EMPTY == int_id)
! e* d$ o- q" {1 e {
6 X; f9 _! R1 S* ? if(0 < length)" {6 ?2 d$ G# u3 p# W: `
{
! I" r5 f5 P; {; t# M7 G // 写一个字节到 THR
( r% I; B" g0 f1 y# j( p UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
( J7 o! ^2 O z3 Z& v length--;3 x2 r! s; e) \3 v
count++;
4 _, b% c. J+ N! D2 U) I1 H }2 y3 w7 D7 j0 g, q- v2 f* p% G
if(0 == length)
6 L, u8 }5 H- v1 ~( G {
- q( @! y7 m2 f# h8 s9 N // 禁用发送中断0 O! M- J% n8 p2 |* K2 U6 I1 V7 b
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
8 L& J1 ?4 ^ g% a( Q }
# p) c( b0 P2 K0 w }/ J2 B9 Y! }( p: H0 K( }$ r
% M) F! J; |0 Z& O // 接收中断4 q! F' ]$ }; u' i6 M
if(UART_INTID_RX_DATA == int_id)
2 q# C' `0 |9 D% \: U4 z3 G9 M) k {8 e: L2 G k& X% B1 }2 C: j
if(status_a0==0)
5 t6 W5 s. Z$ B8 L {4 y1 |# {- }' S$ p b7 h
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS); W8 F$ T [ S8 f) D3 ]- O
if(a[0]=='#')5 O3 l3 e1 ^4 K- h$ q
{9 ?$ k( P4 _' S9 ]$ U* ]
status_a0=0x01;
3 N4 C/ k; w! N6 z4 c( W; u status_a1=0x01;& C4 D' z; \1 l4 d) [
}. ~# m& P, q4 I
}
9 W! n N7 X. h/ h: d if(status_a1==0x01)
5 y+ G2 @! W8 n {
/ `# R3 {4 D' {* y# w5 D a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);2 c0 z5 H7 d2 s0 ^* N0 f
if(a[1]=='R')5 e& N- P" H6 T, U! x7 V
{
8 d! G. S( u" u+ A status_a1=0;& u! ^5 N3 z) K, L5 }
status_a2=0x01;; t' M3 F. g) ?& J
} o% p% H: ^2 M5 x: ^1 v
}
B! a/ m( i+ l& {9 T if(status_a2==0x01)' M6 ~- l% U% b' ^% T4 ^
{
& p% W4 `0 E! w/ @' Y7 ~ o a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);3 H, P: c- |' t9 q8 d) D" t9 E$ ?8 `( Y
if(a[2]=='A')
( i- B" u6 @1 C9 ?3 ~ {
6 ~; x5 C; |! I7 ?' o status_a2=0;8 k A3 }! n; ]% L9 M$ W# t4 s
status_a3=0x01;
& o4 e2 f2 `& }/ ~0 A+ |& \ }
X5 A# y* R8 s }; q* a: F1 B1 B: U4 O
if(status_a3==0x01)
1 z) g+ Q& M6 ~ {
) J" t. b/ k7 | a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
7 _9 ~) a( ?6 `- I1 ~8 {$ ] if(a[3]=='N')5 h u8 o7 c8 _( E$ G3 T
{ H0 d2 z9 {" L; `" z1 _2 Z2 M
status_a3=0;. D* ]! b6 T$ L* a X
status_a4=0x01;2 g* p5 o' W) C2 p
}
4 s. S9 P: m, Z# V) W3 ~( k# Y- s }$ F6 H. s5 ^1 M/ T/ x5 h
if(status_a4==0x01)
/ W1 Y$ s8 w0 _3 \ {$ y! k/ y% p' A) ~0 i' s ^0 o
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
2 \0 ~1 t' y5 j0 _ if(a[4]=='G')
& i; C; C8 O4 d" E {
" F8 U: O5 A5 i" y0 W status_a4=0;
9 b2 {8 S }: U status_a5=0x01;
3 q( W1 |1 X9 }5 ~) i% [ }
Y, R5 ]0 l) E+ L: P- Z! _) g. h }
6 {% [9 o/ f3 ` if(status_a5==0x01)! t- V! }" v* k) s4 e
{
5 p# m. V1 b, K( L4 s* V. ^5 b a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
& M; G4 K U% n/ }: K! a' J if(a[5]=='E')7 e: k- p- k& l8 t0 K, y
{
, `# n; T! W) p status_a5=0;" m4 a$ ^' {3 f- \
status_OK=0x01;8 V$ O7 ]5 @% ]7 O
}
, C2 l$ f4 Q1 X; B# ~ }
; S8 F" ]9 Y' w$ r' |' A/ {( m if(status_OK==0x01)
% [7 \4 l/ ?$ w6 ~* f {
" l0 `5 ~# d( @4 I: n9 o+ N rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
) [( b8 }- A0 _* E" L lengthrx++;
2 ]' C" b7 b i. Y# X4 o if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
8 G; ?+ i8 ~( S8 t" W. p {
/ l- Z) R0 f+ g/ a& O RecState=0x01;
( H& j" ^) d) r }
$ U' L; \* r/ K3 y! y0 {+ Z }' @4 m; k; u' E# p5 ~6 r: x
/ {: C5 l0 e3 L# |- p1 c }
( {/ T1 ^& H' Y. q" J" B8 M2 w# w, t | K" L/ d
// 接收错误
# l' E& Y' `* E5 _5 ] if(UART_INTID_RX_LINE_STAT == int_id)9 D1 _9 m8 b5 V8 ]) ^! [( P
{8 p" [& f. ~. v' @) y
while(UARTRxErrorGet(SOC_UART_0_REGS))
* O( ]; y: u- r: w- S. t {* R4 } y4 s4 c5 U! Y0 O0 q$ P
// 从 RBR 读一个字节9 U: \0 H2 k' E# c
UARTCharGetNonBlocking(SOC_UART_0_REGS);
( N( e+ ]3 \0 Z) @5 i5 L5 u }
: e2 ]1 W/ i- J6 o }
6 ^4 X* X0 ^; K) H& _2 q
4 l. F% v% M. I/ C) M7 t return;
5 ~5 e }: B$ \8 j) q, V7 R}8 J# K2 G' W5 p% z* O
' m% J. z; k7 i& E2 E
1 |6 O" V# ?5 H
( w$ B6 Z2 e: z |
|