|
OMAPL138双核通信,现在需要DSP核中的UART0接口。3 k0 C0 C: {3 J; ]& q K5 d
我是在DSP初始化这不太明白。( i: g% M" x H9 ]. y2 E
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。/ ?2 W$ _8 `. u: Q: o, r
7 @- c5 w% m, b, E1 E7 F- S- F
) G6 k/ x4 d3 L8 q g7 C
首先 PSCInit();//UART0使能
7 X4 u6 g) A: M9 {void PSCInit(void)
7 T# {! D( R+ G% w; D{
# l. L0 V" S+ t. O // 对相应外设模块的使能也可以在 BootLoader 中完成3 D3 S0 i% J! u% G, n+ i" B
// 使能 UART0 模块
. a5 n/ v' @& t' v# S PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
" B0 W) c0 q; x' _/ H7 o/ Q! V}
4 G4 C$ ^( r3 e+ |; y, m
6 N+ Y+ ~0 ?( H: q( t! K. V
# X7 t: S( z& [+ r# r然后是 双核通信的初始化 AppInit();
* M# n' k. u2 ~ wvoid AppInit(void)
# W4 i" o7 |2 I/ `' U{
6 v6 h# d: F# M, u /* Structure to initialize IPC (see Ipc.h for definitions) */
: F' Q1 f: o T( ^7 }3 t struct IPC_cfg ipcCfg = {
# E9 L: O7 _$ p2 B# J( I: b' f IPC_DSP0, /* local processor Id */
1 I: ] `: s! e$ U6 C# M. a4 Y IPC_ARM_HOST, /* remote processor Id */
1 f- ?6 l8 u+ | IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
; r% Y" O; L, R% }3 f IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */. M) Y$ D5 e3 v: c) E0 }
NUM_MAX_EVENT, /* maximum number of events to be created *// P0 O& c9 L: D \1 b! @; j% J; O
&ipcPvMemDsp, /* local side private IPC memory */9 ~6 O. y5 C {! ^) f
&ipcPvMemArm /* remote side private IPC memory */" w6 a9 j& @$ @: ]$ C) E1 [0 [
}; [5 Y. F6 L6 u- G& d8 y2 [/ M
IntDSPINTCInit();
9 y1 J9 n5 G, k6 s; C M IPC_init(&ipcCfg);
" d. s$ y; H) m/ z$ C IPC_intRegister(C674X_MASK_INT5);
4 Y) s& A' `( |7 k- X8 [ iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));- Y# N& m( ~& L& ~& b) B3 T
- t. M$ F/ S! ^9 W9 ? V
/* Enabling interrupts for DSP C674x CPU */) Z3 x, x. C) c1 \. @ s2 e
IntGlobalEnable(); /* Enable C674x global interrupt */
1 | T, c v3 \4 Z8 P& p iAssert (Notify_start()); /* This will enable IPC interrupt */6 d9 B3 G" F7 ]4 V: Q$ N
}2 F6 K% R; F& j! T5 x
4 R+ H# Y6 s& l; t D- r% |然后是
; Z4 Z* F9 n7 v // UART 初始化
) c6 W) L$ K6 c UARTInit();
9 E! ]6 T$ j+ M# x
& `% L, T! E/ q* O/ Y // UART 中断初始化1 A* A. ]0 A+ S1 j$ [ G4 `
UARTInterruptInit();
% _) y7 W' A3 P# b! v0 k" }
o8 O( w6 `# V+ T% S9 [8 u2 Y5 O, {( K, E
void UARTInit(void)/ S; m* A! V* H1 p
{
# G# H2 S/ r% n( Y; Y // 配置 UART0 参数
& W# u* j5 [6 [ // 波特率 115200 数据位 8 停止位 1 无校验位
: `9 i3 v0 V1 N% e B4 t7 }$ x UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,( b7 m+ a/ [" M" y7 Q7 a7 d
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);, Y' y% d% ?+ {
// 使能 UART0# ^4 l8 G# m" y+ R- h( x
UARTEnable(SOC_UART_0_REGS);
7 h" N' O( @0 X! ^& b# Q
8 a2 i& ~8 t3 F0 S // 使能接收 / 发送 FIFO
' ]5 z/ M6 {; M// UARTFIFOEnable(SOC_UART_0_REGS);
) A1 p; X8 E# S+ o
# `, `3 U" D& r, z UARTFIFODisable(SOC_UART_0_REGS);
* P1 Z+ u5 I1 J7 {& Y9 _' v
% L" A/ X4 o0 L // 设置 FIFO 级别 接收FIFO的级别5 y8 G" w& v- [/ k* o5 o" [
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
' U' m5 _. N! h, A" n3 ~& Z}) O- C; l) W8 ?8 V' q1 q
0 _ N( V4 ?. k. L% S& _& p
+ [3 b& o) h' I4 [/ g: M5 _void UARTInterruptInit(void)
5 ~' }% Z' m8 g: p5 R# K8 O4 b1 X{
- Z6 H& ?/ I) | IntRegister(C674X_MASK_INT4, UARTIsr);1 }; F( N$ D8 \6 h
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT); N; u& [8 c/ q8 E4 o2 u; H' ~ R
IntEnable(C674X_MASK_INT4);
/ E- p& O6 u! y$ o3 o v1 ]0 e) O9 l3 ` q
// 使能中断+ ?; O% A6 w A( D3 l
unsigned int intFlags = 0;
; X2 d# r+ s3 Z9 v4 |9 u intFlags |= (UART_INT_LINE_STAT | \
& c- ]8 Z$ [" [9 [. z% n UART_INT_TX_EMPTY | \: E Q4 b& k* t, U" a* o" A1 O. X( Y
UART_INT_RXDATA_CTI);) n) ^* @# x5 f! \; u3 |- f% ?
UARTIntEnable(SOC_UART_0_REGS, intFlags);
$ {. z6 ~ j; b2 J}$ k( \1 i/ j6 L+ s4 m
0 f8 R8 R$ H& }! W6 E
x7 q: W1 s2 Vvoid UARTIsr()5 T& p9 V2 k! z4 ~7 W: }% W9 E
{
; f7 y& D ]# \ static unsigned int length = sizeof(txArray);
8 H1 O% k( F# K3 }( ] static unsigned int count = 0;* c' Y9 `) o/ P( e$ S$ Q
unsigned int int_id = 0;
# v% B$ B0 u6 p [! }$ Y0 p
5 \" E4 }3 ~$ q& C# [8 w1 R; j$ }. K: h3 Z3 q: l
/ d" o5 x1 `; s // 确定中断源
! X" e2 P X/ l* b" f ` int_id = UARTIntStatus(SOC_UART_0_REGS);1 I2 }* c1 G8 q+ m8 F$ @
% y. ]2 w! Q% s0 `# r' o" V
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
6 w% M9 b; }5 f% n+ s/ f9 e4 w! `& Z) w; o
& |8 d4 L V" m( Q2 r% |- K7 j // 清除 UART2 系统中断0 d5 T# T3 ]4 \) k& [3 G! b
IntEventClear(SYS_INT_UART0_INT);7 H# x# i( M2 Y; p: |- S$ z
% P/ ~! f# y1 Q6 S$ O, Q) W: c+ m/ j+ {
// 发送中断' b; \' a b3 P3 I) g' j
if(UART_INTID_TX_EMPTY == int_id)
* r. o* s! P% i0 R2 _4 } {
- W$ M2 K6 P" a/ ~9 ~ b/ _ if(0 < length)
& @0 l& Q. s- U* n1 p; D6 } {' R, [* T/ _3 c4 m5 S6 ]
// 写一个字节到 THR8 n9 X; h" u! `8 V
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
( X( X' F' x7 w$ \+ V% A length--;
( d! F" }/ }6 f9 e9 v! g0 `' u count++;$ [( ]9 I* p" W1 }
} C; a4 w9 k( l% L5 k
if(0 == length)
/ q* K2 M p9 x4 D0 f" @ {
9 T3 f1 S2 s6 O5 b% _0 Q) M/ B // 禁用发送中断
. W& h3 p9 S% ?2 }7 V, ^8 b UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);$ ?5 A8 i; F0 i2 L# H U
}5 s! A+ @8 T% w" Z) R
}
8 ^2 s) d! J8 t" o+ q, p2 q5 Y8 K) ^
+ J" i7 Z: \! u5 _+ \6 W // 接收中断9 t8 [7 A2 M; N R* g h
if(UART_INTID_RX_DATA == int_id)* b3 {; u9 j4 x
{/ |1 i# R9 C/ R" c" s* B2 Z% R# R
if(status_a0==0)" A% M/ Y6 X+ o$ D" n
{4 A2 A) u6 V6 W+ g& @( \1 C/ H6 G
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
# ?) f; L5 s: H) G0 D% { if(a[0]=='#')
3 x# S* r, w3 S. r8 @ {) [8 ]& |8 _& i. I& K8 z# |
status_a0=0x01;; C5 ?& l7 L/ i+ I& R1 u
status_a1=0x01;' N7 {/ R$ z: E, c6 S3 u
}! b+ k- J5 C9 w' K/ J& }# @) d* R0 R
}
0 ^+ b( T: H( B4 m if(status_a1==0x01)
+ o& }# o; |2 {& F! N {
% u* _' p$ `% ^- v L9 r, c a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);6 f" W) V7 W1 p+ @7 j) v
if(a[1]=='R')% V) C9 r. x- G0 t- N% P* Y, m
{; G& X; v& n! J: ^" o
status_a1=0;
& T+ h$ P0 o* Q @, @6 d status_a2=0x01;4 J( k8 E, D2 V5 c7 T. ?7 x! i
}
4 C7 E+ {3 Z# Y5 t }
+ D/ H- \1 O c: f3 ]* g0 Y' d7 E) K% _ if(status_a2==0x01)
; h* o8 C% F) g2 K: \! l! U {/ i4 _; ]/ o- B3 z; s2 R
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
. a% `6 D6 N) P- A if(a[2]=='A')( a1 T+ O/ f8 ?
{, P6 _& \0 _* C$ O
status_a2=0;- p7 g- z6 c9 J9 w2 g' i3 I
status_a3=0x01;
: C8 ?% t% p" G- N }! e, f: f6 B: g2 I8 r2 G; }# [
}
, p: P% V$ E: T) r0 [ if(status_a3==0x01)
* o3 }1 D7 t) R {( w1 H: f: y+ z
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);0 V' a f, v( {
if(a[3]=='N')
0 N( X0 L4 k) Z+ s ]: R2 o {9 l; z5 h9 @9 `& B9 r& }. Z3 h
status_a3=0;
% ]- o. V5 z0 w status_a4=0x01;+ B3 |7 Y* F: x) ^( B
}
0 K$ X% [2 T V$ _' B! r2 I% r }" q% L4 G* u7 H3 k" y
if(status_a4==0x01)
$ L8 ]& J$ i. x: N {$ N' k# j& k* i' j$ O. K
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
. c' t8 m; \2 ^5 Q- x" R if(a[4]=='G')7 J, J' r3 q% d* R+ K0 X
{
6 ?; c. ~7 ]; I }' v status_a4=0;
9 L9 Z ?4 k1 q0 V status_a5=0x01;+ [$ e) x' W+ v7 A6 B
}, C d# |% I/ p" y
}
& y* y Y8 l2 z" C3 F" P6 g v* ~ if(status_a5==0x01)7 Z, u0 W7 ~( ^1 Z
{+ a+ d. B: ]4 z2 f) N
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);6 C& A5 R1 J7 }% t" l
if(a[5]=='E')
, n* Z6 M# R, n1 N2 Q7 O+ |/ H {
: W5 r* z9 g0 X9 T: Q% o; k/ b R status_a5=0;
# F/ {$ L3 R+ ]) V% L1 \ status_OK=0x01;
u! k" W1 M# D" } }
6 j" W+ d7 n7 `- ^4 x: U. ` }
$ F& c2 Q* D5 t3 U+ S" m% t# t if(status_OK==0x01); N7 h# D! x1 k3 S
{$ m& L+ h4 e5 w
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
7 O; ?$ C7 r$ W. J$ z- X8 }) w# r lengthrx++;$ R; I2 l0 ~; |% g
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
0 l5 P/ k; }, i6 u8 } | {
" [1 @" ^6 l- m5 ]1 o1 Z RecState=0x01;
. N1 G) h7 K% [" p" ? }
: }, T5 a( y, n+ r0 r) j }
; O# H/ A6 X2 _$ ?9 a& P, {+ E! X+ E; s
& R- i6 A- z9 H }
9 [& S- |: r# J6 D. m: c9 ^3 C, N- c5 f: |! ]: H1 N% s
// 接收错误0 Z8 q. E" M: v5 B, m
if(UART_INTID_RX_LINE_STAT == int_id)4 b9 V7 G( {2 Q' z0 r! C; H) ]: ?, U
{9 W! f3 a! V: p! _$ N/ a: |8 m
while(UARTRxErrorGet(SOC_UART_0_REGS))
$ u9 o" i, a- H& ~9 |$ y. l {3 e {; n! ^) G0 V5 n
// 从 RBR 读一个字节
9 I( K n2 X$ g8 t UARTCharGetNonBlocking(SOC_UART_0_REGS);4 V% Y7 M( L1 y9 b# c# ]- r* L' G& {- Q
}, ?4 V' I6 m: w- j
}
, }. z4 H7 Y @/ W! U7 W, [4 d/ K5 \$ R% ?# b0 z! [" t
return;# C& O1 v) G0 _! P# m$ |
}
+ L5 s6 e+ [4 F# y) Y+ P
% ^+ j- _ c% x: x9 @5 J2 S7 J1 u7 E# p* S6 L
* O2 X8 N; J: f/ \* N, M- K2 a& s |
|