|
|
OMAPL138双核通信,现在需要DSP核中的UART0接口。' H X, B! e8 L
我是在DSP初始化这不太明白。3 G0 n- V/ n+ U" H
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
! c) ^# |! `8 t5 ]: j X& Y5 h$ T7 G2 x6 {' P# Z6 R
' n1 M$ y9 k7 b9 p7 M5 Q! y2 g
首先 PSCInit();//UART0使能
& }% e) U' h3 g$ Gvoid PSCInit(void). B( k! O! s5 J6 e* U4 T. a6 A
{
# y" M7 E$ [7 A4 W: d/ x' ^ // 对相应外设模块的使能也可以在 BootLoader 中完成3 A' q6 {% ^' F% q% }
// 使能 UART0 模块+ C' V# L- |; T# [7 v
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
7 F, x" m# O5 F% ^' L}. Q' z6 B" \6 }1 V
/ i; Y- s2 _; ^3 L+ g
1 Y, W5 v6 M& B, |4 G, N然后是 双核通信的初始化 AppInit();/ _4 M* D. w T% n+ w
void AppInit(void)
; N' D1 t) A7 _7 c{
8 j: E1 c' b/ O6 R /* Structure to initialize IPC (see Ipc.h for definitions) */( j+ _3 L( a" _; X# R; F
struct IPC_cfg ipcCfg = {
+ m" B+ o, X/ c* g IPC_DSP0, /* local processor Id */4 R7 J) s$ U( k) \0 i; ^
IPC_ARM_HOST, /* remote processor Id */
: i5 t4 Y8 H" D3 p1 p9 t IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
7 s* ~! ~# ~9 T& r4 z+ }& V IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
3 H/ G. w7 s7 B6 | B' [ NUM_MAX_EVENT, /* maximum number of events to be created */
( }) A; `* i, U- T0 d$ F &ipcPvMemDsp, /* local side private IPC memory */
9 M1 D$ P$ M& N9 S v% ] &ipcPvMemArm /* remote side private IPC memory */# P9 L! E5 W, R: v+ J# ~7 O
};6 h9 E" W/ J! v [) W @- i
IntDSPINTCInit();
7 F5 N4 S! e0 s IPC_init(&ipcCfg);
& \% a4 I& z+ ~+ m IPC_intRegister(C674X_MASK_INT5);: c E7 n8 W+ S7 R- x% J
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
: z# U: v) |1 g. u2 E* Y+ E) }' ~# C: t+ s7 x
/* Enabling interrupts for DSP C674x CPU */
9 W6 f& c; L5 b! Q! f0 O+ p IntGlobalEnable(); /* Enable C674x global interrupt */4 C# [& _' V/ o% W" q w. }
iAssert (Notify_start()); /* This will enable IPC interrupt */% k; Q6 S l3 d) a. u. I
}
; r* h4 r' k& S! z$ R) |2 Q$ }$ s# W0 ]7 d) b
然后是 5 `' L! q% w4 P9 v# g6 o; c; c; o
// UART 初始化
4 K3 }6 V2 m3 X6 f7 S. Q9 t) F: T UARTInit();
# G. T2 e: q" v" d
. h+ k) c) i( Q& A$ d0 K# B2 R // UART 中断初始化 E+ I' C. J% ~5 D
UARTInterruptInit();3 U& z/ L+ ]8 H* x% q
3 n. C5 l: z# h+ H0 b1 O# d
0 p9 I* r) H3 p$ ^7 _9 M
void UARTInit(void)
6 L5 m5 {5 f; X/ D) a7 y{0 I: g8 c) C& J
// 配置 UART0 参数
9 Z( k' T0 l, F' y; B // 波特率 115200 数据位 8 停止位 1 无校验位+ M* T0 t0 ]4 M3 l( v
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
4 [8 Y" f6 _1 b UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);, W! H! r) t4 _' _; p7 ?
// 使能 UART0& B* }3 x4 A5 L& I' Y: N
UARTEnable(SOC_UART_0_REGS);
$ }/ F; z+ ^/ C* Z3 a/ S: h
* N, d& m. l! L // 使能接收 / 发送 FIFO
( W5 Q' z* P1 a6 o9 w6 P// UARTFIFOEnable(SOC_UART_0_REGS);" B! e# S( |; V
8 t$ J L9 I4 N UARTFIFODisable(SOC_UART_0_REGS);
, ?) K/ p7 {4 {% V3 D
& }: `3 i# |2 c1 y6 Z+ F2 w/ X // 设置 FIFO 级别 接收FIFO的级别; B; [6 X* R& g# J$ H6 _5 I4 k4 G
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);! \5 L* o& e; y% {3 u1 Z
}/ L' s5 h2 X; Z
3 \0 j* u8 ^( @0 U- `! Q. y/ d: w; L3 d% a: J/ N
void UARTInterruptInit(void)
+ s$ H0 [4 Z4 t" s; J2 A! D{3 L- g& n+ V6 ~5 L3 [9 Y' H/ V- x
IntRegister(C674X_MASK_INT4, UARTIsr);# [) \0 Q* b/ B+ K1 l$ E
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);* D. P5 X4 R* W
IntEnable(C674X_MASK_INT4);) g9 B t' g, }: b* W6 Q$ G; N% I
8 k! P% u7 r0 L. h4 K
// 使能中断$ T- E, w5 }8 M" r2 f! w
unsigned int intFlags = 0;$ R U5 ]9 ~( ?7 C0 ~
intFlags |= (UART_INT_LINE_STAT | \
5 }. @' N+ {& v UART_INT_TX_EMPTY | \" `( Q& D3 D j# o! t5 R+ D. i) x
UART_INT_RXDATA_CTI);
( a. _. K* L, S! g( a% |( W UARTIntEnable(SOC_UART_0_REGS, intFlags);
! i+ }% Z7 K& V3 A z" D3 J7 C}
! s& G/ u+ G4 ?5 C5 A3 R/ `. l8 v' m% J4 C+ X
4 i+ X! i* u) z: Jvoid UARTIsr(). p$ L3 G2 L. q& V& `
{
+ u- z' P( i* p& k4 X static unsigned int length = sizeof(txArray);
. d+ j2 O6 `+ ~7 L static unsigned int count = 0;
* h* e; `4 q0 h# a unsigned int int_id = 0;9 J# n( }8 s* ~
9 _9 s8 N$ n0 g, G$ P8 F. o: e6 s
5 M2 x) ?' X: \) t7 v7 I
# a9 v' S; I- w* L0 ]; d' a // 确定中断源
% q2 ?( [( Q: _ int_id = UARTIntStatus(SOC_UART_0_REGS);
0 c8 b) b; b9 V: u$ j7 F) M3 T
6 ?( Y2 \) L4 d4 T // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。# ]6 K$ N8 r8 Y, y3 E
% I$ p% S+ H- w. ?* b( p! n8 Y0 d% A; Q: I! F
// 清除 UART2 系统中断, W! I$ Z9 T9 S+ x: E
IntEventClear(SYS_INT_UART0_INT);
& Q$ e+ Y0 v9 C$ p$ y
2 j4 Y; g; c. s // 发送中断4 r) T& G% ~1 {$ {0 Y6 @" W6 U
if(UART_INTID_TX_EMPTY == int_id)
( `1 F8 s7 t$ v4 g% l6 A {
$ b: _3 n0 v1 S/ A* A( J9 [ if(0 < length)
& m; i3 I3 p- j- V! j- f {
6 U3 @- L* b- J" d: F+ @6 L/ o" t9 x // 写一个字节到 THR
6 o/ k- E( i! ]2 k0 d$ q& r UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
- r* b$ z7 g* u1 Q; E L! }- E length--;; ]5 D3 N& t* ~4 V, x$ H9 X
count++;% ]+ P& u. N. D# S6 Y8 C, v
}* \. W }, G5 r: R
if(0 == length)
7 d" Z; s: o& f {
2 \9 j9 E, S7 X$ j, N, _ // 禁用发送中断* @/ T/ ^: i$ {2 ]. h/ F
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);$ D, ~) w( R! d; d$ C! A( d
}8 j0 j; \- j+ i
}/ C" H; p- E' n F d
0 X9 X& G9 j5 f4 D- f // 接收中断9 x% v' h- w* w5 q7 W/ e+ d
if(UART_INTID_RX_DATA == int_id)1 R! B- m0 @: w9 ^
{- R7 f: ]7 F. m, ^6 L
if(status_a0==0): o7 Z# D' k/ \1 @* F
{
$ v- l0 N( k: N a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
3 R2 J$ }; ^$ Y; g) ^9 D+ ^ if(a[0]=='#'), b& N$ H" C9 c# O
{& {7 }9 {+ d. e" w
status_a0=0x01;7 h+ j7 D4 K% m: R
status_a1=0x01;
6 o) f- T; G) O( ^ }
% ~. u) {- G+ o+ ] }
3 {6 q0 a& K" {" F) Q% q if(status_a1==0x01)
" k0 n0 L3 L6 l) Z# f# M- Z7 n {9 o* U: d! ^+ d T7 x) z
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);7 a$ K# k, V8 O1 y
if(a[1]=='R')
, E" ^8 W5 H/ N5 Y {
l, U1 e0 f- f1 t/ b! U status_a1=0;* ]& ~3 B) p* B! S1 }7 `( u" A
status_a2=0x01;: I; i; m0 {: i( [. I' i) g
}
1 E1 W$ o; [9 ^ u% T% [3 o }
# G3 ]) a; M9 [# O ?$ O3 M- S3 g if(status_a2==0x01)& d8 P0 r) J& y1 p' u" `
{
5 I$ \# ]& k4 R( i. s a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
4 o) d* Z3 v9 a5 P1 X' ]* Q7 |- O if(a[2]=='A')
$ Y( R. }* ^4 J7 G {
: G3 w0 \, Q& e1 j) @% ]* r status_a2=0;. U4 O9 ~- T7 L- ?1 ~3 O3 I
status_a3=0x01;
& @! V4 O1 e8 H$ ?1 N, j }
& X+ S! a/ V8 T( f" ^2 c0 e }
$ m* @0 f2 e( B6 @- ~' t+ W* V if(status_a3==0x01)4 L: ]$ p: k6 J' r' l+ N# K
{- R! g; F0 n& B* I; x
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);1 O+ k/ i! Z) W- Y5 l& R2 K9 D9 @0 B
if(a[3]=='N')2 Y0 u4 A( N J) ]. h+ u2 y! ]9 J- K) g
{
; k7 Q4 }1 [8 Y status_a3=0;; G! Y; G4 X) q0 T$ f2 C! S
status_a4=0x01;9 p+ E8 H' ~! r6 ~7 ]
}5 @, Q; C% Y4 g. @: r, S |
}
7 G, P5 f+ a& L0 d6 p7 ~( w if(status_a4==0x01)9 V5 \ M7 M8 k2 ~; W0 U
{
7 d! \! c0 r' X: Q( I. |! J a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
; i Z; R: U o" V8 u8 z if(a[4]=='G')/ d# p9 Y k9 ?7 c' ?) B" v# G
{$ z9 j4 B' K7 l- { b8 H- Z
status_a4=0;
2 q% ~6 |! h8 H+ ]- S: f2 W status_a5=0x01;
2 p' V& M: O4 ]8 {( h }
# S% D3 [5 ^5 u- W( o }
! e2 j$ F* p; F- z: k if(status_a5==0x01)
* `8 T* p+ V7 ^9 g2 [ {
: T; k5 w$ P' i a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
: S4 [4 T, h3 B8 W2 I! I# {/ y if(a[5]=='E')0 m6 s/ A+ ^; t6 o1 I' G: q4 F
{. B% |$ g& R: K8 f+ v- N
status_a5=0;
% j1 O3 [# H/ p+ F [2 \- h4 V status_OK=0x01;: d' ^6 S, i5 F4 Y5 k6 T
}5 ~; [* ~) f1 r9 ?: o3 E) W
}. F0 ~, j9 P n9 h) V# M" t3 D) P
if(status_OK==0x01)
7 P- |& M) b/ [/ x9 s6 n3 a1 J# g( y {& @( q2 H P/ s( }$ U
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);( e) S+ K# o: k7 c# q+ J
lengthrx++;
. i1 [1 j+ m1 g9 r/ C& T! J2 ~ if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
5 A9 n" I) I: t" o3 f0 y5 }- ? {4 u! f' i: F4 D% N
RecState=0x01;6 k" ], Y# g/ P `
}
- r" l7 [6 Z* ?' ~7 F0 y! C; B }
" m9 [' `3 q3 r. P6 @& X
5 } J& O: ]# t3 O }
9 e" Y- f1 B! S9 k, ]1 r+ y, Y$ [& r! w4 b, e# \
// 接收错误, @1 X% A+ E+ t) N( X9 y S- }! f
if(UART_INTID_RX_LINE_STAT == int_id)
- e7 s% d% |' A0 s {
6 [0 m8 o( I& y2 I2 ~; a# g' Z! t+ Z while(UARTRxErrorGet(SOC_UART_0_REGS))2 e/ `! `7 z( | _+ |
{. ?; j ?& I: p& Z9 @8 N
// 从 RBR 读一个字节
# q' p2 |* s' W/ c4 E5 N" C UARTCharGetNonBlocking(SOC_UART_0_REGS);
( J( a2 B3 |1 ~5 } }3 D7 P7 ]& Q' {7 F K7 m& `8 s
}9 r9 W" B; {4 m. l4 U
* s1 M) @/ b8 b# I9 e7 O$ A
return;
# S/ u4 r5 Z4 D! b% j}
. {/ n9 Q" h* v4 g! C( P5 d# g- m9 u, {* o" B/ d
3 b7 h% h! r! |- o4 a' N) O
. @) d& {1 e+ G. a |
|