|
OMAPL138双核通信,现在需要DSP核中的UART0接口。) X n$ [4 c1 _ o6 {9 Z; u9 H
我是在DSP初始化这不太明白。( }% ^ ~2 J/ q% Y. d
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。* C7 d1 ?- T4 e
3 a7 W# X' j/ k5 N' ^) J5 q8 d
2 N4 A+ p# w) v, ?首先 PSCInit();//UART0使能: [$ E( [5 M4 ]* G0 T
void PSCInit(void)
- Y. P$ G, q0 F" O{
/ b0 W+ j. j9 T: V1 F // 对相应外设模块的使能也可以在 BootLoader 中完成
- ~5 ^& {, f( ^+ N! ]# v // 使能 UART0 模块. J1 F( H; i/ `1 H+ c0 E& N' K2 v
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);) a6 K3 t) j3 a$ p* @; ]% n( g3 ^' [
}
* a- z) l( y! y# ^8 ?. y1 ~" z$ w, |( l7 ^% ~2 L' T
6 c8 F/ a& a; N然后是 双核通信的初始化 AppInit();
7 K o8 u( O! Zvoid AppInit(void)& y6 _$ Y k9 Z+ Z1 h
{4 q! `( ^5 g p: c& F4 r
/* Structure to initialize IPC (see Ipc.h for definitions) */
6 \9 ^. i: C+ X9 x7 M9 v2 e struct IPC_cfg ipcCfg = {5 X8 X# p2 w' `) @0 l: R
IPC_DSP0, /* local processor Id */
0 K% l: C Y9 ]8 x IPC_ARM_HOST, /* remote processor Id */
7 {7 q: |+ ^, u) u9 j' y* ~$ d IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
& s$ C% n- [9 A) [$ s0 U% t IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */0 o& h, |: }8 v. c
NUM_MAX_EVENT, /* maximum number of events to be created */
! L) ^; y0 t) O &ipcPvMemDsp, /* local side private IPC memory */; L/ R4 W/ J% s
&ipcPvMemArm /* remote side private IPC memory */
2 Y6 K6 E( ]5 P, x$ ]9 z' a5 q };% d7 w+ a/ S* H; w# ^; d
IntDSPINTCInit();+ v y& A: x0 [7 |7 d
IPC_init(&ipcCfg);
; g/ ]+ {- |. W! k5 ] IPC_intRegister(C674X_MASK_INT5);- U! x- T( w! T& H! k* n
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
. z" M- Z( t9 V# S `1 v" K$ C5 H0 I6 p
/* Enabling interrupts for DSP C674x CPU */$ b6 v) h3 X; s3 Q1 j7 y* `( G
IntGlobalEnable(); /* Enable C674x global interrupt */
: l/ W: Z# d# f& `+ Y5 X/ F$ j iAssert (Notify_start()); /* This will enable IPC interrupt */: s: N) D) V' s6 f0 u% B4 L
}
7 B4 j: _* R @2 X, _# `0 f, E2 r/ Z2 u* N: q1 r; [
然后是
) d+ e- V$ ]; t( C2 g, s // UART 初始化
+ W: a/ t' K7 a, o: e UARTInit();
& M2 P" n, o! K- I6 v
' Y; V4 \, {; R" y3 Y; s) | // UART 中断初始化
- J3 H% h4 X9 I0 Z5 R: Q5 o UARTInterruptInit();
2 S T+ O- ]5 g& d" _- K% W/ c
2 _: j; V$ Y0 k# |" d% h3 r% R6 Q- S% x
void UARTInit(void)
0 P- m+ k" |' s7 t; X. R{
* l$ b9 i' ~) x( i8 G% } // 配置 UART0 参数- m7 {2 }6 f3 A x/ t1 H
// 波特率 115200 数据位 8 停止位 1 无校验位; C8 c! O; O& \! ]' w/ j
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
. u5 j. p1 `6 s3 y" {' E1 s8 t UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
+ n6 s5 k# |3 k! T+ c# n // 使能 UART03 P2 h1 H3 M4 U$ N7 k U9 [! V
UARTEnable(SOC_UART_0_REGS);+ k( I9 c% S6 ~! G6 p. c6 r
) j: j; G0 v! ]* t1 o" s // 使能接收 / 发送 FIFO- m7 n* \* M: o& |5 _
// UARTFIFOEnable(SOC_UART_0_REGS);; t9 k# Y, G' H H4 x q
, P1 s, A. Y' Y0 I UARTFIFODisable(SOC_UART_0_REGS);
7 s0 S8 G! O8 n# H" q) |; \; q; ~+ d) I
// 设置 FIFO 级别 接收FIFO的级别
# Y! J% v. u/ X: E// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1); F5 [2 o6 j: F
}/ B% \1 b8 z1 |; V+ t
# {9 w/ r4 V% d4 v4 T' ~7 _6 a6 U- S
void UARTInterruptInit(void)
1 K7 R6 T9 m, E% e2 i' x{
) O3 y; b8 d. X4 a0 e% d IntRegister(C674X_MASK_INT4, UARTIsr);
) U7 j' b: U5 b IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);- W; F! o$ V1 @; D- i. Y$ Q7 e
IntEnable(C674X_MASK_INT4);
k7 {$ D4 n5 g i, }3 b- P# V, _. O% s/ U7 N
// 使能中断# z1 d/ g2 s+ {2 w
unsigned int intFlags = 0;
C) t" G {5 [$ }7 { intFlags |= (UART_INT_LINE_STAT | \
9 T* A/ a" r- I# v4 K" x4 n8 L UART_INT_TX_EMPTY | \
' h1 P; b$ O) s, V4 P' { UART_INT_RXDATA_CTI);) h1 v% b0 f. Q1 G2 d, E2 s, c+ i
UARTIntEnable(SOC_UART_0_REGS, intFlags);
9 H+ V, X& b9 p8 [! h! _}( l+ B4 a& D( G2 Q/ F' I
& I3 k) \' M( j( c: k
f/ f0 }' v* h4 S* B. q7 Rvoid UARTIsr()
' y( Z, S- p$ O% ^: r ?{0 X" R3 w3 u1 B A
static unsigned int length = sizeof(txArray);5 A* `2 c$ p3 Z$ X' c
static unsigned int count = 0;8 I. U2 X+ I- @ q
unsigned int int_id = 0;
$ |7 d& T9 p, N$ P6 f& q1 V! ~& R: [
% e N5 Q: i/ q6 z# @4 E2 K+ q; C3 f1 ?4 g) }- l
// 确定中断源
+ ~( s$ }* T+ j* k int_id = UARTIntStatus(SOC_UART_0_REGS);
- N/ Y( X' s5 i) M
. i: h4 }3 k! c4 ~$ b8 P5 S/ z6 h // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。0 a# i/ Y& @/ F/ ^/ |
* r" a9 u( F; T8 [
/ e- ~* e" n0 U: V$ M7 N/ h, i
// 清除 UART2 系统中断! L+ a& c9 D# i, Z& x3 g# i' [
IntEventClear(SYS_INT_UART0_INT);
: C9 T' C$ u. d# s1 a0 r: G" l) A. ]
// 发送中断6 X( d% W4 T r. S( r
if(UART_INTID_TX_EMPTY == int_id)
" d5 k, _% g. H6 y; q( s { R+ u( r8 |- ~; U
if(0 < length)- q6 ?6 m% X! R5 d
{
, }; E7 ?$ n" X3 Q4 N' z3 T: x // 写一个字节到 THR
: M( K' K$ K- L, {# [3 ^* x7 i UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
8 L# h# J H3 ^; w! } length--;
- R, @% s! p+ o! E+ Y8 v count++;4 S, A5 J2 m6 q* _/ ^4 O+ r2 }' R9 w
}
! o, Z7 v4 I" j1 a' x7 b if(0 == length)8 x0 L4 m3 L; i8 M8 `$ x
{
# s7 a: W: G; Q O6 O // 禁用发送中断# |$ a& u1 z& S& E
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
0 u0 s& x, k4 x; K3 V$ s2 d6 ?- a+ y }
0 d. V$ `& n- R% C N }
$ L* ]8 I8 Q9 u& ?+ v4 e# L- l2 ^/ T& s# A( t
// 接收中断& R, N! g6 X) X/ k( \6 C" l
if(UART_INTID_RX_DATA == int_id)
6 x9 r& r* q) c5 e {
) }9 d4 Y6 ~$ y: P( f if(status_a0==0)$ G2 M+ q, @# J8 I! N; ~ S
{5 Q5 ]; D" {* a, ^$ |3 A% u$ K
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);: j% C1 v, Q4 }" o
if(a[0]=='#')* s' e/ x+ G/ k, c7 A, [ k) o
{
p% ^1 L ]- z; z3 ~+ I; T status_a0=0x01;1 H# L+ n( W0 b8 L& S- p
status_a1=0x01;
+ z. m0 B1 ^6 P3 t4 \6 D }) ^0 |% f; l& w. D& c" k
}4 E- t$ }1 Y# G
if(status_a1==0x01)
. u( p! t' @4 t4 P0 q+ i. _, e {
: B" W( Z7 t+ b, f9 k a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);& P7 E) G- Z: ^' n# n8 H, {
if(a[1]=='R')
7 S& T5 _6 g9 @( `+ f3 ^ {
' t2 d+ }7 b% }( |+ T& C status_a1=0;
5 ^$ K& S4 a6 L/ T status_a2=0x01;
; c1 t' H: }: ^' j }+ x @3 W. ] A! g0 S! e
}! @5 v8 _ q1 t% S+ j* j8 `
if(status_a2==0x01)4 V+ ~) P# T; p; t
{
; d$ i5 A" |! D, F" g a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
% R9 ^5 V, D. v3 p* j: O if(a[2]=='A')8 ]9 X* F! ~! F* w: S
{. c% L6 C) T/ W0 q7 s
status_a2=0;9 q! I' k2 o2 \+ g# L: g: I7 P# X
status_a3=0x01;1 b8 @7 ?5 K! J$ Y1 d! P! z$ |
}- V* j& E* Y) P* {2 w8 k
}6 a# |( p. g4 h7 j; W
if(status_a3==0x01)+ k* I" s5 B$ e
{
9 `1 n% w0 Q$ w& e9 m7 k8 {. K4 X a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
8 t4 t0 n# [/ z$ U4 G* ~$ Z if(a[3]=='N')
9 g) V. ^" o6 d. X* u {/ {4 ~& \% Z! o& [% K& r7 F; }
status_a3=0;5 k% \9 s' x" t
status_a4=0x01;. j5 m( u; U' b0 i/ g
}
- r$ p% d# z$ Y' Y& j9 s! X# q8 {5 C }7 |! b" L4 I5 |# u* |7 Q
if(status_a4==0x01)
5 z7 B: |: Z/ {$ g' q5 z2 k {( I; s7 e% G1 d0 Z) J# e5 D, Y3 _
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);& Z/ }2 u" o1 w0 v: B7 p1 o3 C
if(a[4]=='G')
0 V6 ]5 |% t. ^9 ^# g {0 ~3 L7 @# U( J7 Q8 Q- i
status_a4=0;2 D/ S. Y1 E8 k& V. e( G" ]$ n. C
status_a5=0x01;
/ T0 O) |+ V6 q7 e }
4 j2 k$ o1 n; F0 s }
- Q* R8 g7 g( Z# I9 } if(status_a5==0x01)
/ |& m+ [0 t& k, W {
) P* s* E" b# m+ u# C) `( v- S a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);* p- k& r& D1 _0 T p: G; u
if(a[5]=='E')# E8 w' v) e* `. J$ w! a
{$ X. F- _: b& W$ m
status_a5=0;
7 \9 {3 N3 j2 Q" N status_OK=0x01;! m8 \& m# M: k
}
" L; p/ `+ H2 E- r* S: b/ j* r+ L5 x& [ }6 b7 T2 Q- K6 b9 `
if(status_OK==0x01)
) g, A) g) `3 {. z+ a {
. p- u& X6 H# h1 ] rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);5 `2 s3 [' G; U, N
lengthrx++;0 z. j8 h8 C( j; `7 \' B1 @
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)* h# o/ H$ b: @5 P
{* Z( g% b- t8 Z" h% ?
RecState=0x01;
2 ~( T T/ P( v: s+ U }* E; Z* C. _/ K! B" T" Q8 h* V
}
1 v6 X& Y. S t
" R8 l! ?' C: e5 c9 k: A }% K/ ]+ P _: W! R- o+ o J
; G k, q) C& l& y // 接收错误
& y5 P0 K1 y: ]8 D if(UART_INTID_RX_LINE_STAT == int_id), p& ^: p/ b& g9 ^8 A8 N
{# z+ J. l$ b* e% M5 j( F& s
while(UARTRxErrorGet(SOC_UART_0_REGS))! O& n8 |& b3 u q, B
{
6 ?3 i% F; X9 `' b, _0 A" d // 从 RBR 读一个字节% X9 V5 {% T& Q' T
UARTCharGetNonBlocking(SOC_UART_0_REGS);
: f! d: i4 g, D+ G; V! L4 H }
2 N" j1 q# v9 U7 R L }/ X6 j, B& O, p
6 ]) |( P' S+ F4 c- I
return;
+ i9 w m1 D' q. i+ a2 y/ R}' g& g8 K- q; T8 Y) w; _
. X4 p+ w/ }) X
7 r7 V! `/ M" \$ B- X% O) @+ N. ]
! d& \; t$ |. l3 r! ?6 g- g |
|