|
|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
' o7 F2 V h/ I) Q) j/ K6 }5 Z我是在DSP初始化这不太明白。
) `1 r7 |* o& r初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。2 R1 }" m" ]7 ^5 d2 V
4 M" y1 v1 C* B; V) K2 J: Q4 [
2 k! r, p' D. x0 z& L
首先 PSCInit();//UART0使能8 }% x" f( u8 y. A" m, W5 \7 L7 B
void PSCInit(void): e3 U6 W' [9 o
{4 P1 \. O. W& A: R. M
// 对相应外设模块的使能也可以在 BootLoader 中完成
9 W' ~& e3 X& z$ L$ z# Y: ^ // 使能 UART0 模块
$ _4 ^9 E' m! D# J A: I PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
( ]* [0 q6 D- v, ^}
& v' N8 t' F" s- r5 d0 G2 I7 n! L2 r4 P3 P, r$ A9 K$ b7 V
4 n; ~! F9 E" b4 Z% ~' {* B9 q- }3 X
然后是 双核通信的初始化 AppInit();6 t1 ~4 f* }$ f: p/ p- P. `
void AppInit(void)3 T: b: q0 }5 {1 y
{
7 h! l6 s. ?; E d: W9 G /* Structure to initialize IPC (see Ipc.h for definitions) */& u2 l% r2 S3 I/ R! Y( {
struct IPC_cfg ipcCfg = {
9 q: O4 L9 \. _5 l8 R! s IPC_DSP0, /* local processor Id */. H% \7 A4 i9 V+ M
IPC_ARM_HOST, /* remote processor Id */2 _; x3 D# N5 u
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
/ {3 Y6 H8 X; z8 n# n1 q" v9 \ IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
1 E0 c" b* w( @ j4 b* s1 O NUM_MAX_EVENT, /* maximum number of events to be created */
4 a' _1 H0 F" Z( X: g &ipcPvMemDsp, /* local side private IPC memory */9 q) ~; @, g+ o5 H/ h, d
&ipcPvMemArm /* remote side private IPC memory */
) Z# q! h$ L! f. S };
2 n+ D2 \: o- H: o9 K) i IntDSPINTCInit();
- g+ L% u! N4 t9 c/ A' U5 n5 ?% ~ IPC_init(&ipcCfg);* S5 {7 j0 B2 I6 M4 |
IPC_intRegister(C674X_MASK_INT5);1 h- \$ `' c9 B
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));; L% g/ K, H5 z9 ]: Q
, f! o. ]" {$ ^+ U# Y3 r9 z /* Enabling interrupts for DSP C674x CPU */
2 M5 y& @ w0 o+ H: }/ B2 | IntGlobalEnable(); /* Enable C674x global interrupt */
( k% g% P/ t( g2 V* i iAssert (Notify_start()); /* This will enable IPC interrupt */
3 B* J' f; j- }8 x) y3 B}
( I+ ^1 i4 w5 O: y: x3 \2 Y' r3 w" x" E1 w) U
然后是 / x3 b$ c5 Q" k% G2 [( t2 u# r# k
// UART 初始化
! B( A* L8 i9 [9 A& I3 e7 f UARTInit();; d' I. R, p5 J" Y' c; I: v0 Q
* Q9 c1 S4 H9 [7 T3 p3 Q1 e$ K
// UART 中断初始化, ^ O/ U( l2 o& O
UARTInterruptInit();- d0 d8 r' ?! ?+ u+ p3 K+ B1 I9 K
4 @$ U' w- F) a' u0 y. v5 d, \2 I( u e' f% L1 n3 W
void UARTInit(void)
* K+ a* X: l6 }3 x{
" N& _4 V6 t1 P) U9 Y+ h7 n" @ // 配置 UART0 参数3 j3 i8 ?, @* h+ s
// 波特率 115200 数据位 8 停止位 1 无校验位! P' g J) ~3 u/ Z/ F
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
% T( w; c n5 Z4 a6 f, o& X& a% m UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
& b9 u; Z8 @1 H. [* x/ X // 使能 UART0( A$ ~8 @2 J" B2 K
UARTEnable(SOC_UART_0_REGS);9 X8 `! b0 Z/ w- o
1 M0 M( v: P3 U% c7 k
// 使能接收 / 发送 FIFO9 b% K+ |8 z$ X4 `' ?2 M- ^
// UARTFIFOEnable(SOC_UART_0_REGS);9 U) T7 z7 s2 _9 N1 p# C
1 p3 n" m, k6 b3 K UARTFIFODisable(SOC_UART_0_REGS);+ H. n3 m$ h4 d, d% Y
$ P. N8 R2 d2 C/ h# G; V
// 设置 FIFO 级别 接收FIFO的级别
$ z, Q/ d+ @7 d! L// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);7 n8 d0 ]! Y2 _
}- a1 g" d) m5 e/ Y5 p
- h" A5 X% k( B/ w) m& r1 c! b
0 }2 f; R) L& `( f3 c6 {4 ovoid UARTInterruptInit(void). R& A0 j: O2 }- W
{
9 Z2 x9 x) B* o3 l0 p IntRegister(C674X_MASK_INT4, UARTIsr);
: v Y' N$ r& x# h1 i& ? IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);5 W) X% d$ o M/ f/ X, ^
IntEnable(C674X_MASK_INT4);0 t R4 Z3 M `! u
% l3 u% g. W: x/ C5 Y" I8 Z
// 使能中断 [/ F9 P4 O/ i7 r8 v& j- D
unsigned int intFlags = 0;3 R" `% t, L0 s3 x8 d! x
intFlags |= (UART_INT_LINE_STAT | \
! V. T7 `, G& q7 d+ t$ q UART_INT_TX_EMPTY | \/ Q) I& f8 C0 F$ w# Z9 P
UART_INT_RXDATA_CTI);: L1 y' y0 [* J% t( W& _( w
UARTIntEnable(SOC_UART_0_REGS, intFlags);+ n" J& r% ]- i/ u1 y6 |5 Q8 |
}- f% |# k' M4 K/ u1 U! y; a
, W( F1 v/ q; q! ]$ R
2 C' G# T$ t2 w1 D2 H6 }void UARTIsr()
# Z6 i h2 K! O{
2 q* M/ L. q; d+ X* d static unsigned int length = sizeof(txArray);
6 D4 d0 N k/ W3 d3 { static unsigned int count = 0;! |# ]) v' C! t+ G* I
unsigned int int_id = 0;: Q2 t- R& X$ L7 d, ^1 f
6 t; R2 R, R# A) x3 o0 G9 O( w) T3 ^0 m: @' [- y
" W. i6 @8 t. \& G8 u2 M, V
// 确定中断源( i. z& p) @3 D; v/ c- U1 c) t
int_id = UARTIntStatus(SOC_UART_0_REGS);
7 r6 q$ _3 k$ \/ t' {4 T) u) m9 M7 I; g
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。3 K+ @& ~) R, `8 r( ]2 P9 T) E$ |
8 G9 c; K! q8 G+ V# H' O$ j- v
// 清除 UART2 系统中断! }7 O4 i( I' L6 ? r# M
IntEventClear(SYS_INT_UART0_INT);
1 f& k! ]7 H9 }! V b" D
% S$ z* k3 |5 ^3 S' Y: ]3 | // 发送中断$ z# h4 W, _, w
if(UART_INTID_TX_EMPTY == int_id)
$ e( z: g9 i6 n" @ {
" V- ^9 ~2 }. p if(0 < length)- P& O" y% @. `8 v: r
{
. F6 g: f) I1 P, A; o" v$ ` // 写一个字节到 THR3 R; O9 s) {& M/ Z# [& \
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);" z* J M9 _, I% d4 I9 U0 l
length--;
# K( A J5 v9 D& y4 ?+ } count++;
' F2 R8 U- E5 v0 U( @; f* ? }
# j/ ]- h* H/ P if(0 == length); e; q/ f, n2 d% i. B- R) \ X
{
: d% J& j/ f. P0 g! I // 禁用发送中断
0 d, P0 D5 [7 [. f2 t UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);; f3 z; M3 f5 A. V/ I# @
}
8 W& @* m& l" z( l0 N }
& P3 [. J0 P( J+ E8 A* g
* x* j r( g" {: m& ]8 \ // 接收中断
3 x, y. o5 ?4 L if(UART_INTID_RX_DATA == int_id)
8 P3 e* {' y5 v2 {+ Y& \$ E7 q2 I$ N {: @! W# w8 X7 `; Z# K
if(status_a0==0)
! ^" z3 G* _7 b4 i3 i {
( R2 X8 N- T: @. x$ | a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
U7 S$ z, L9 t: `, v0 X* k if(a[0]=='#')4 d" q6 A$ J0 E7 u3 ^: w& O
{# Q& z4 Q4 V( I
status_a0=0x01;
) v) f, x+ A% @( F" o status_a1=0x01;
5 v& K8 z3 ?. T }8 ?2 a _6 w! T& M9 P9 f( `
}
9 d5 C8 ? S: `* W" {+ o- o if(status_a1==0x01)
8 i. } ^3 {5 G* U1 f0 j* a) ^ {
8 Q" `/ u1 i: O a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
& v) c+ H [' v& A6 m if(a[1]=='R')* L3 T8 h& S: \* k5 C
{
9 m3 V0 Z; {5 M# \ status_a1=0;
8 ^' R, |7 o C* U, j. {$ y: } status_a2=0x01;( F! b# V w# q% O
}: ~0 l$ g* z6 X+ n; C- p
}
2 w, U% H1 D) C: m, G2 z if(status_a2==0x01)7 x' O! A$ K: N7 Y
{
. G' a ~( V+ l0 T a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
. t( W9 S3 S7 b; T if(a[2]=='A')
9 a8 E( Z$ f) d- F9 k8 h {# v0 `, ] d8 k8 D6 E9 S; s
status_a2=0;
5 T3 n! b; S0 o" c \ status_a3=0x01;
. ]* w1 B# x/ x( E }
. h0 f6 o S' p# h2 M4 s/ u }* Y4 ?# x( k* C$ N1 n7 w5 M
if(status_a3==0x01)
. n$ M: |$ E7 D* P {* Y6 h9 C4 s7 {
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
, ]+ ~+ z. w0 L$ k9 f/ ~, W1 r if(a[3]=='N')
6 B$ f8 d8 K e0 D k {
' v" q9 ~0 V6 n status_a3=0;# E e+ w- ~7 _) ]! z
status_a4=0x01;) u; V6 J( O; K" c$ v' p
}0 X1 B8 K; B) z! v) C/ f/ S+ O
}
! ^3 }$ m) _) Y/ O if(status_a4==0x01)
. D8 `. N; ] }. x6 C2 d {( g/ i" k: v0 z7 l2 h$ \! V3 |
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);- r9 W$ v* D/ W% |! ^" H
if(a[4]=='G')
v& i$ |) _/ M; l, c2 q+ v( G {. v: x0 b0 t2 ~$ `/ Z/ X+ ^
status_a4=0;
9 V" C0 z7 e1 v( M+ n( w status_a5=0x01;; m$ q/ r6 i' C3 B9 }5 x# e9 a
}
0 ]- S/ W( }; Z$ c2 Z+ Y }% V; \0 Q% v: K) M* b" n/ F" h
if(status_a5==0x01)1 o$ D. g) Z! _6 l1 t3 E: t# O
{
. i) W+ Z2 M. r7 n a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);, s1 G, R* B0 ]
if(a[5]=='E')
" f$ V# O, A/ v2 m j7 H5 X$ } {& W6 X5 M9 ?2 d0 D( r J
status_a5=0;0 g0 j5 R, [& ^! @1 B0 R
status_OK=0x01;
* P% l: [% l z/ V2 { }
9 P9 |: |8 T0 E! V% D }
! T3 ^2 z) s5 T4 [; |8 \ if(status_OK==0x01)9 J C! R8 I9 c4 L+ K$ e! ?
{
4 G; a% k( D$ M, _" } rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);7 v8 P0 p b( v6 @
lengthrx++;
, a( B$ |2 e8 z9 T2 n" ]7 V if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)- S& `; F- q9 `
{) i; [5 D! K9 l
RecState=0x01;
" ~2 _/ ~4 b* ?. G3 Y+ b }/ n- h6 C3 P q; `( }2 x
}- x9 M/ q. i3 ]3 d2 _5 x# R/ s
, p0 S& o/ \; D. j0 k
}1 P$ M2 M. F% D0 z( ]
7 Y7 I2 [ H2 [3 [6 A
// 接收错误& m5 \: k4 X( s: O7 G- J
if(UART_INTID_RX_LINE_STAT == int_id)
3 `3 L* f# Z, \/ Z6 [7 C& P6 D {
( t# W2 {6 a' P0 p while(UARTRxErrorGet(SOC_UART_0_REGS))
% z! d4 q: R& G D {2 g" Z4 d# }* j9 v( l
// 从 RBR 读一个字节
/ c |- R% E; Q' L1 {" V UARTCharGetNonBlocking(SOC_UART_0_REGS);
& ?2 V0 L+ k' ^# {& C. @2 ^7 J }
$ N5 {4 F+ D. U- ~3 d' ]" n }. P- ^ x% b G5 n
: E3 A: ` W$ ^- u! [& L7 U$ n
return;4 e9 s* u" L0 S8 L/ \; I
}5 b0 c# ^3 I; A- i% s2 R
) ? M* L$ I) Y' a7 ^3 `0 p
5 T/ t2 s( o$ n$ ^( ?6 b" }) ^2 E# v% w4 W$ A
|
|