|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
* ^% x y: L; v0 C# D; z我是在DSP初始化这不太明白。% O2 u8 f( ^% u
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
( T5 f. w q& j% N9 f: {$ L7 B. A; M2 {, ]" i5 j
5 e* g/ L6 K; Y5 N首先 PSCInit();//UART0使能7 o) A0 `: _$ M& ^
void PSCInit(void)2 j5 I0 h+ Y0 x5 R; c* r6 N
{. g/ o: W( F: Z* q" T
// 对相应外设模块的使能也可以在 BootLoader 中完成
% P# [0 _& {: L& n$ k; l; T // 使能 UART0 模块4 Z9 B" p' X5 R# _
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);$ c) Y( t7 r8 y5 Y6 S: Z
}0 L9 Z3 r+ U- s) ]2 o% g
1 I( o4 Q9 K: B9 L% B* F% ^$ @3 O, B$ \: ?
然后是 双核通信的初始化 AppInit();
) }' B+ ^/ R. X7 A- g6 W' Rvoid AppInit(void)
! G. i# {1 j1 Y. }: L: [. Y{
\: p- S+ h; g& T9 o6 a9 e' k2 E5 X /* Structure to initialize IPC (see Ipc.h for definitions) */
/ {$ R% v; j9 o7 V5 l struct IPC_cfg ipcCfg = {) X# O1 I2 E7 a8 m) `* E' s
IPC_DSP0, /* local processor Id */4 a0 } H. Z( W- J- P1 q
IPC_ARM_HOST, /* remote processor Id */( l! g5 V7 @) l/ {, D
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
$ n) W0 T. M7 g( H7 ~& ?. q- b0 E IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
/ ?, O* w. b/ b+ X6 } NUM_MAX_EVENT, /* maximum number of events to be created */2 ~1 k* s; r8 J6 @! ~8 e0 a3 ~
&ipcPvMemDsp, /* local side private IPC memory */6 \. l1 m- E; x7 _( N
&ipcPvMemArm /* remote side private IPC memory */6 z- N$ e* {% E( u1 }' g3 }+ i
};
; n. C0 s1 V! ]- R; i5 Q IntDSPINTCInit();
7 Q4 V' O0 P. Z3 |: g IPC_init(&ipcCfg);
" W k9 [+ a9 g6 a' h IPC_intRegister(C674X_MASK_INT5);
9 d6 u8 `! Y: N% j) t0 |: P iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));" Y5 P A5 f) s" I$ [! y* c
7 L6 g3 P9 M6 p /* Enabling interrupts for DSP C674x CPU */. _, ~; V/ S6 N1 ~% `) Q
IntGlobalEnable(); /* Enable C674x global interrupt */
/ N& F" z% D1 D0 S' F- [# G iAssert (Notify_start()); /* This will enable IPC interrupt */. m7 ?6 c! C. Y6 W
}
& T2 K* E; n/ i/ ?
" C: m$ J5 t( E* ^$ I2 S然后是
7 G0 E1 n% X! A R4 f3 f9 C // UART 初始化
; c) D3 g3 u: P0 i UARTInit();1 E/ j0 E' C, x2 N( A# N
4 c% z5 E6 Z$ d4 u // UART 中断初始化
9 B. q. }# r, I( D* Y4 J8 o UARTInterruptInit();7 D1 D( i. n" X* Y" x+ W7 \' ~
* ?. s3 Y3 C% j. N1 `! c
6 k4 b5 I$ b0 C' c& A: [
void UARTInit(void): o: M1 r1 _) X) k
{$ f, {9 `2 U$ `1 M+ @% Q
// 配置 UART0 参数
6 }' j) E" O1 A3 B- J& \ // 波特率 115200 数据位 8 停止位 1 无校验位. Y4 ~( W5 B' ?4 D' Y1 [8 Y, M5 N
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,9 X D' q: j$ D. C! ]( ?4 r% y% C. @
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
5 k) R3 q' o2 D* s! N+ _0 t // 使能 UART09 y! ~1 u5 B9 H! r0 s/ P
UARTEnable(SOC_UART_0_REGS);
5 {/ n0 }" C: Q c0 V/ D6 C- s
// 使能接收 / 发送 FIFO: V, S- @, }7 N' c. L: p0 y
// UARTFIFOEnable(SOC_UART_0_REGS);" b$ ^ S- L0 X' p! P" E
. m" g" r4 w9 ]% q4 i" ]! I( E UARTFIFODisable(SOC_UART_0_REGS);3 z2 J/ v) }. n6 y6 B
/ |3 b8 p* k+ {2 B. c // 设置 FIFO 级别 接收FIFO的级别
/ l9 s, t0 _+ L- {, A// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);9 q5 P3 w, d6 Z
}
) T3 {' p3 b. D, g
; C: g% A- I+ c) t" ~/ w# ]& f% z% G& _/ R7 O
void UARTInterruptInit(void)
% A1 q' h0 E- o2 a% S8 Z% v- I{
$ i5 d1 v( A% S- i IntRegister(C674X_MASK_INT4, UARTIsr);
; L. X% X4 y2 w: B; V. O IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
# `$ r7 F+ ~3 B1 P2 i IntEnable(C674X_MASK_INT4);9 A8 U9 }3 ~7 D& i. M0 `
9 w5 h k1 y* a // 使能中断/ ?8 w Z) ]) h6 `+ x
unsigned int intFlags = 0;
% H% o i6 D8 B intFlags |= (UART_INT_LINE_STAT | \
K7 g9 E/ q# p* [$ ?5 m2 u/ O8 S5 i UART_INT_TX_EMPTY | \
) B% f3 m# a7 o) t8 _ UART_INT_RXDATA_CTI);5 `2 I1 b4 @3 ^ o4 _+ Q
UARTIntEnable(SOC_UART_0_REGS, intFlags);; H' U% F! Q) V( o- i3 }
}
7 o& ?0 Q5 o) s8 y
" _* Y9 {/ _* A
# b8 }' C+ y4 S+ s; Uvoid UARTIsr()
0 z+ F% J) l! t! P) L( b4 O/ J# l{
$ u( U. P- G( {: c- n. x static unsigned int length = sizeof(txArray);. n( {- |7 ]4 R9 B2 e f1 i
static unsigned int count = 0;
0 ]6 R( U( b9 q+ l' L6 n, I. v. a unsigned int int_id = 0;9 \) m/ G( O# o8 ^ y; W
k: v- B5 N! K
# N( P2 ~7 J2 {+ k7 d$ g: S: A
* f7 c2 k; }8 m$ D- h // 确定中断源
2 k9 l( H7 o; D int_id = UARTIntStatus(SOC_UART_0_REGS);
. U+ ~% _4 ~: [! O) r! R, I, L( E; ^
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
! f: S- F8 a( l8 d+ k- c4 K! T; g. P C1 s/ L
7 a+ v+ k4 v" O3 g
// 清除 UART2 系统中断
; K" v* ?* @ U& S IntEventClear(SYS_INT_UART0_INT);
8 w. x) H/ U, d5 w, s! ~" ]' @* d; q1 j9 w! W. o0 Y
// 发送中断
9 J' `; t3 \3 K2 g0 ?/ F if(UART_INTID_TX_EMPTY == int_id)
$ a; p& W5 y% V8 w9 I {
5 F. u& B; h% K9 ]/ } k/ M if(0 < length)2 B; `9 m3 ]- [0 c
{
6 L& D4 M, J; A( t5 Z) n // 写一个字节到 THR
, Q g& w' S& |3 \( ? UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);4 A* P' F1 a# N5 x" N( b) j7 Z( T
length--;
/ x% C/ u1 i' d1 U% F+ s" g; O count++;, Z, T, A- w, d( f4 R
}
1 A3 O; Z: N7 @ if(0 == length)
: n6 M' r# t% U+ p/ I# D {
4 w1 a( G t" s5 F6 G, s // 禁用发送中断
: q V( x, v9 l, M) }* g8 h3 K UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);7 t( c3 J1 y- w6 n7 g0 b* [, [
}7 E; n1 t9 |4 G9 s) H! {2 g! j
}& w. P- b/ X7 p6 Z" R5 v
- q6 h6 h5 r6 k b7 i9 C1 L
// 接收中断
& s7 y2 E7 G @8 @ if(UART_INTID_RX_DATA == int_id); p- l5 k* X9 t! z+ ^2 \
{, T/ h4 l# R+ A8 F
if(status_a0==0)
: F( }2 Q; n, F) E. f! ^6 s! ~2 { {! ` ^+ w. P% y4 P. a: X" m u/ O( E
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);5 n) K3 Z: o8 Z1 T+ J
if(a[0]=='#')/ T* k$ {- ~; d3 N
{
& X8 ~ p% @6 d- d# }+ q2 d# r3 j status_a0=0x01;
4 A/ K5 }3 G, ]+ V8 N' o- |8 I8 o status_a1=0x01;3 _/ r/ i' G) _) C1 C
}
% U/ F9 i! J/ W8 i4 { }
3 u7 ~' z4 L: A+ G# C if(status_a1==0x01)! K1 l% y) ]; _# l" M: B
{: @( _9 H+ ~ ^
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
) F2 A/ q3 Q2 i' E; G1 R if(a[1]=='R')
, T' `' R8 e2 s" L- q6 Q {, R. m9 t4 @$ E7 m. B' K
status_a1=0;
$ t# a+ p' `( N" W: c& E ^ status_a2=0x01;3 n- ^0 @; z, D) O9 p; C
}
/ ^. b# O# B4 }: n- }2 K }# g( @ B& V' H0 k$ {+ T# B- {: H
if(status_a2==0x01)6 I) z2 A+ O2 }% Q: l5 m& A" ~
{
, N+ E7 k# [5 {) ?. ]6 A. Y5 @' q a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);8 [/ d) a6 C: k
if(a[2]=='A'). W, c& |/ \% I, {
{; I' \7 c+ W9 y. |- R g
status_a2=0;
2 W! [2 C$ b, H5 K4 z status_a3=0x01;
8 G1 a9 i5 U' s H }
" n) Q) w0 q+ _5 R }6 g0 R- {; ~/ A& m, U
if(status_a3==0x01)
, r. P7 ^, Y9 E1 } {
. y( @/ s' f. ~0 _. h/ L* P a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);( c7 f/ N2 \% y1 E
if(a[3]=='N')4 P1 w( q4 h$ P
{
% ~7 M2 D D; p. _9 A' E status_a3=0;
' [( d+ W* K2 b6 X$ z+ C status_a4=0x01;
" l& Z8 b1 G5 R+ q" Q5 x6 v! i }: R% [9 t& a. q
}" z, y' b7 u2 J3 S
if(status_a4==0x01)7 ]) Z7 K. {9 ^3 Z$ p# u$ w
{
* m6 s! A3 F) }0 |8 x9 [ a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
& w2 W1 H2 L$ q2 |! v+ ? if(a[4]=='G')
; w3 J6 A" H) E& s- w9 M {
! Y2 x; _) f: v! X status_a4=0;
% r; n( i# I9 x: J8 \ status_a5=0x01;! X" P3 X. F3 i, `; t7 r# c
}
/ ?9 Z; M/ M0 q7 m* K- l% z }
+ F- [5 _* R Q4 ] if(status_a5==0x01)) ~) D- N1 f) O9 p0 o
{# l4 d U k S- }2 T* D
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);' h" D# l' C, C: T9 s6 U
if(a[5]=='E')
! G6 d. X5 O1 x% r5 _# s+ M O {
; i8 x7 m$ o1 N; x1 | Q5 R# ? status_a5=0;
& a9 {8 F' h1 t: I: P) \ status_OK=0x01;! M$ t2 V {3 W& U
}- U9 F- q) }: v* L6 p# o6 M- l
}3 r. I9 P5 X* N( x( g
if(status_OK==0x01)7 b) p4 a# L4 F" n( N3 I8 c2 I
{
. W+ J& [6 Q8 n+ n* _2 b" p+ x rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);1 M6 M2 ]8 I/ s2 N! h. _) B* k6 k
lengthrx++;
0 j" S; O! e7 o7 _; P- f if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
( a$ z+ k9 a W% C7 Q. h { A, P8 O* L- A9 v1 ?
RecState=0x01;
. }: Y2 s/ g2 O( i- t5 I- l }
! m0 R! s6 G( { `% q }. E( W8 D U, J
) {* J/ H) T2 E. n7 d
}
% v) J0 M3 S$ |4 |4 k
* v6 N. u3 S e // 接收错误
& }3 H7 u5 }- ^; v9 a# Q9 F if(UART_INTID_RX_LINE_STAT == int_id)) l- s8 [% y$ O5 `& J" k. a
{
' Q2 l, ?0 ?5 U/ S7 L/ ]1 h while(UARTRxErrorGet(SOC_UART_0_REGS))
( A3 O* r, w* v0 x1 }- O% l {
- Y) l( R2 X: m. q6 u1 {7 T // 从 RBR 读一个字节" p9 t0 [. t2 ~9 n* b; i
UARTCharGetNonBlocking(SOC_UART_0_REGS);
1 b; i! J4 M0 J1 b5 {5 \' T% N }
. M% u" G, m7 {$ `6 C* } }& |7 `5 R9 i; ~& S2 \5 ?5 }
" U8 V' e& K6 d- j- g' d0 O( r return;
/ |1 i- u7 S e& a9 c9 z}& d' F3 P7 t; F8 i1 r# R2 v
|0 b9 Z8 w3 H) f+ T9 p; {( G. q# w5 U
; T' @' O+ h- w' L5 h# V# P |
|