|
|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
$ D+ M4 G' V' k2 ~我是在DSP初始化这不太明白。. P' `7 P, R% L" u; P
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
. T% @# b. I4 T6 y$ U/ x% B1 O+ l q! h! q4 e
' R2 ]& U3 x1 b; g) ^首先 PSCInit();//UART0使能$ h" V: L, G7 }3 L$ `/ N L
void PSCInit(void); V: H- s2 T- @+ k/ w8 ?
{' P, `% W+ \! A& o, @) V" Y
// 对相应外设模块的使能也可以在 BootLoader 中完成
( d' `" p* T. g9 \! [ // 使能 UART0 模块
) v$ l6 g5 J( U1 k! R6 @7 C% c PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);: o+ V9 Q9 X3 h! K7 z* c" ~
}7 x* c: i5 e* E2 W) L/ \: e
4 Z% e: Q9 r; X8 I: U! `1 V% x; `- G0 ]% r: R
然后是 双核通信的初始化 AppInit();, T6 C9 c; D; u6 d5 x1 g
void AppInit(void)
! v& Y6 }1 |% W6 T{; [& Y4 u- c& _8 K* Q7 B" ^
/* Structure to initialize IPC (see Ipc.h for definitions) */
' N7 _7 w2 f/ h" P2 Y struct IPC_cfg ipcCfg = {6 L; m: H `" O2 G- m' i4 J/ I% h
IPC_DSP0, /* local processor Id */
3 }! v# }! D0 a1 R IPC_ARM_HOST, /* remote processor Id */# w4 }$ a5 j( Z
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
+ u/ }: |) j* t8 Q" W& V; | IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */2 }# |2 @' L9 ]9 V- h
NUM_MAX_EVENT, /* maximum number of events to be created */
2 W3 V) r1 H0 r &ipcPvMemDsp, /* local side private IPC memory */, D$ x4 j# J5 Q& | m
&ipcPvMemArm /* remote side private IPC memory */
) k, T7 g; i$ z };
$ v# E/ }3 ]: O! V7 I- c1 i2 Y& Y IntDSPINTCInit();
; R3 r8 j' P' _$ _- n IPC_init(&ipcCfg);
& o: G- g5 F) v) ?8 U# L! k IPC_intRegister(C674X_MASK_INT5);
7 ^$ J/ Z* y3 l- H& x% ^$ B+ v iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));3 T1 M* h1 T. T+ O8 v2 _- l
8 R* M7 W! K" D8 J& u
/* Enabling interrupts for DSP C674x CPU */. _1 a1 q" c- Z$ A& t* E. q
IntGlobalEnable(); /* Enable C674x global interrupt */
9 l* {( K/ D3 p9 L$ f/ p iAssert (Notify_start()); /* This will enable IPC interrupt */
: |/ Q/ G( e& q9 ^4 Y) I}- A" U: s; ~% d+ N3 m/ T
- I$ U" R% d1 f: n( a& D3 P% o# x$ ^然后是 " t$ X4 L+ @: D. O' \; X0 f
// UART 初始化
& ~8 g# C9 P! ~2 V3 a v! { UARTInit();
& m# W X- [( P8 z- R% r- q9 @2 u. ~& s5 q
// UART 中断初始化
/ C4 [. l g' [9 m0 P9 h UARTInterruptInit();
- I, B! Y6 g% h7 W7 [; M
; K6 _, m' M% [) o/ H1 c6 d
, V, T. N' @. J. F, \void UARTInit(void)
9 b1 o2 s9 T, i& i, ?% m' f{/ l, u# n$ l u- F
// 配置 UART0 参数
! I" X; o' U* }- L9 @ // 波特率 115200 数据位 8 停止位 1 无校验位
( I; g7 C# }1 t8 S% Y; ~ _' s z UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,3 h) `# ~, `0 U$ @3 ^9 Q; U+ [
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);0 G R7 U" U5 k! T5 F
// 使能 UART0# _. W- }) K" f- D$ f6 u5 m! Y# r9 [/ [
UARTEnable(SOC_UART_0_REGS);
* ]7 j. N; B5 h& E/ W. v# d/ _ h5 P7 F1 u G
// 使能接收 / 发送 FIFO
* _2 w$ U" M( B) C4 [' P// UARTFIFOEnable(SOC_UART_0_REGS);0 p4 q* T; M u% m1 o, T: }
% {- s" x2 W2 T2 x8 A
UARTFIFODisable(SOC_UART_0_REGS);- l7 a3 c2 ~# P/ h0 o1 Z, P7 q
" z7 B) I% C4 Z1 f
// 设置 FIFO 级别 接收FIFO的级别' g5 i; R' I, A! P
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
: l; I) r2 B- u! e}! x6 m; W8 V! D$ M' y
0 J& O. n& _; C" w
4 R# J: _3 F5 \" K+ ~* @- F, k" |void UARTInterruptInit(void)
. F# V7 |$ m8 k' A6 T& E{, M( [0 g# s# E/ D O
IntRegister(C674X_MASK_INT4, UARTIsr);% y0 e% c5 V2 `
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
9 m6 Y8 t( R- G9 w IntEnable(C674X_MASK_INT4);5 v2 a7 v4 I0 p% t# o
' e5 n. @) [; p- [
// 使能中断
, C1 a+ w3 M9 {7 v: E4 H9 L: M6 K unsigned int intFlags = 0;/ [9 c4 l. _, {! q1 v z4 @6 U7 M
intFlags |= (UART_INT_LINE_STAT | \
$ x( }" H$ T9 w+ e( F UART_INT_TX_EMPTY | \
: t$ u6 |, D7 Y" B UART_INT_RXDATA_CTI);
- a0 h; H7 N3 x- _7 d( g: q3 \ UARTIntEnable(SOC_UART_0_REGS, intFlags);$ I% ~& z l: W7 B7 ]4 S
}
" g. Z; \: b4 }
: v8 o! U( m( `6 Y. W) g
6 G: C. z, D7 hvoid UARTIsr(), A/ u/ D. l! N' o% c& F1 _4 U
{3 y/ f5 _5 o. a9 X# `- C4 l
static unsigned int length = sizeof(txArray);/ p2 o' `/ k% P# x" @. C
static unsigned int count = 0;
% z. z( k, L9 j, L) b. k unsigned int int_id = 0;
$ B1 ^( c6 `* D% l: l, e* Z P- z1 B! a5 E* p( y/ }1 A4 a% g) S* [
! c6 q& H7 J: F7 h, |3 R& c
; U1 K0 |; _# G$ B // 确定中断源
% U# `4 L! R V- Q% F/ ]* G int_id = UARTIntStatus(SOC_UART_0_REGS);! N; h) u7 V( N* A0 @/ b+ C
0 l# q4 E( k3 K' g7 I
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
8 v1 B3 @; ^! k% c5 z% D6 @; O( }0 i$ `8 S4 W
$ u8 ~ u9 n4 R% U2 B$ x
// 清除 UART2 系统中断
+ V: P; Y4 _% s0 y. @8 g; f IntEventClear(SYS_INT_UART0_INT);
+ I3 a0 x$ y: \' k$ I4 l# a. i
3 C$ A& r* [! l3 ?( b0 | // 发送中断
7 _% A7 j- M9 O' g3 S+ q if(UART_INTID_TX_EMPTY == int_id)
3 n3 W5 I, G6 z" N+ M {- S, d% y: T' \: o9 ~
if(0 < length)
" C9 I- y0 T1 ^( \6 y/ O2 J {
; m/ F" h# G h // 写一个字节到 THR1 F7 q9 T8 [( S9 ]
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);3 o, q% n' Q4 _( w
length--;, z/ } a" @8 H. ?
count++;
/ ~. e+ W2 D$ ?9 Y: A }
, w' J- ]" R/ v5 y if(0 == length)7 g. @; h+ L3 O" m
{ f9 C' k# d: i0 r
// 禁用发送中断3 w F5 o6 l4 t* H! p. b# \
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
: z& Q) E( E1 l, n- ~) s. \% v }
0 z% t0 ]9 U* M# t8 y0 {8 y }
8 @/ p; F( V% p: x4 s- ?* _6 [5 U0 O, r& `8 @
// 接收中断
4 N% E/ ]' P8 E6 G; i1 o" X if(UART_INTID_RX_DATA == int_id)* O) b% x) l' E A. h
{
3 j1 U5 u5 n* H9 ~( \( S if(status_a0==0)
O) M# D- O4 I5 Y' X* | {: U1 n' I, ?6 K
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);: I1 d3 G( M9 A3 U! W9 U) f
if(a[0]=='#')
' ^' }2 j6 K$ D9 Z3 I" S {4 X% L( k5 v2 t6 Z4 d6 L
status_a0=0x01;' a& h+ J3 _, t" d1 b' {' w' d% W
status_a1=0x01;' @- l. Y% f$ N5 \ z' @6 Q# a
}5 Y( B X/ R8 }/ ^
}
x' U w' @$ v: I if(status_a1==0x01): a1 @6 e ]) {' |/ t: L* c( U5 z' A' d
{- ?* `7 t! _- d, M% }+ [2 _
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
! g" N+ m7 F9 C, c if(a[1]=='R')# V, P1 z$ U' V3 D1 |2 W
{2 K! J# P) J2 k2 s: _
status_a1=0;8 o! R( w- B `+ v* D( T* M/ |' |4 a) e: _
status_a2=0x01;% V: A6 v. k1 k' Y% [$ [
}, h0 J. [9 z$ b% l- e9 B* v6 y
}2 z9 \9 o8 z) c) W8 E5 o
if(status_a2==0x01)# z9 a# i$ V: Q" B
{
! U% r/ a+ W- T2 ?# f a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);0 s; C2 }$ m2 O- o, m) I# y7 x& q
if(a[2]=='A')
6 T9 [, ], H& r- z2 s {; }6 ^' K6 O2 j1 t2 R* c" |
status_a2=0;( Q' N' p0 b; }' u9 I/ U
status_a3=0x01;# B: y+ p/ H5 F0 H
}2 H$ z0 T8 }0 n' \- |" c
}, m. M7 s* g. P4 ^" f- t+ W7 f! t
if(status_a3==0x01)2 j6 a7 k4 Y% S K2 }" G) k/ @9 J
{
; M& b% B4 K/ s( @0 _% b a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);2 |* a7 X' ]9 Q3 X: a3 B( A1 W
if(a[3]=='N')
/ X( t- i7 U: @ {
' L: q8 z' E& M3 q9 P+ j status_a3=0;7 l+ c. o: M$ _$ x) k* u
status_a4=0x01;
/ z$ o+ p* x/ O) g }$ X R0 Y1 X# E# _/ G
}
& i7 \# G( K+ c6 u if(status_a4==0x01)
, V) j) o1 e# \ e2 ^/ W {
5 `* V& x. J2 N# u7 ` a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);' b" a9 _) c. ?! I& Z& Q
if(a[4]=='G')
9 ^- V E' r2 M# v% O# b {9 r b6 }6 G9 w8 l5 N2 D
status_a4=0;6 ^6 y+ Q4 w8 a n$ Y" n
status_a5=0x01;
; u, b7 q3 R) u6 k, {5 E }- {) U; I2 y. R+ F3 I6 L/ W
}0 h% e( c* V2 r1 C2 L, u% n1 S+ W
if(status_a5==0x01)
- W( e" ?, A* v# _ V/ T {
! g. k6 Q5 m' K& H, \5 ], } a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
4 a6 g& O' `7 [5 j if(a[5]=='E')) { S& `. H W
{# d/ b, t U, J+ h9 @7 [
status_a5=0;" T7 M6 C5 @+ b
status_OK=0x01;2 E2 l2 C5 O N3 K$ a! E' z+ |
}
; |5 F$ Q# u% d! {. _: h1 Q: |- z }6 A* Z5 \# K! V8 w; E) C, |
if(status_OK==0x01)! |+ _) u' `# v: o( q9 C
{
8 \; a: E" Q7 r rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
. V1 c6 r$ W. t* }, `5 ] lengthrx++;7 p9 q J- e0 X3 n ~
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)2 C! O5 U* Z: ]: |; r9 n" {; M
{
% G& D; Z, H u* X* D! m RecState=0x01;6 H) p: f4 T0 U5 w# v; A
}
: H' q! F4 C" u: ]( K5 G }1 h! m: E. p/ B% C+ C
8 @1 R3 X! a7 W' u. E5 ]2 Z& ^& } } M, f4 j1 e) b0 v$ g3 w) A# \
@0 v% @( z. H. E! d; B. d // 接收错误
. s/ c P( x/ j if(UART_INTID_RX_LINE_STAT == int_id)
9 o! _6 `+ R D& }' [: L { t. q9 Q2 n. h9 y
while(UARTRxErrorGet(SOC_UART_0_REGS))
3 P- K/ x# x. s4 s9 H {
% b9 P2 r: A6 O8 }4 a // 从 RBR 读一个字节
: E+ o3 Q. U& N4 s' s( m UARTCharGetNonBlocking(SOC_UART_0_REGS);
3 w0 Y5 b7 @5 j2 o, N }& N7 k0 W _8 q( a1 `5 e
}
" X5 M' b) e) s$ W% O* h3 i7 F+ y: y" k
return;- i z# r* C, ~
}: |+ T4 Z |6 Y6 N, b: m
$ {: t" d! a: t. y H, [+ ?
+ N6 J v7 t6 ?" x8 j1 p7 A$ |( }( B1 k* \* I! D
|
|