|
|
OMAPL138双核通信,现在需要DSP核中的UART0接口。) @9 ?, ?9 i% ]( M8 o0 N0 N" x8 c
我是在DSP初始化这不太明白。
) \9 P- J5 f2 M初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。' }$ f; d* O" Z! V$ s$ Q
( S' a- m# c7 K2 `% W0 Y! M
: c: r) m2 K5 @1 W! n. N首先 PSCInit();//UART0使能
8 K+ Q. J& K/ _" E6 \void PSCInit(void)9 R# b, t+ B- ?% ~% r! P& J% P
{$ G' M% t0 P+ e# ^" S+ {4 z/ e
// 对相应外设模块的使能也可以在 BootLoader 中完成) u8 [" n' h; Z& [- d
// 使能 UART0 模块" ~' k7 T8 P8 U$ z
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);" M9 }) G9 I" K
}, r. f1 o5 ?$ J3 M
: h0 {: F6 B4 E* I: c! {
6 v Y. R4 A1 N2 }* z然后是 双核通信的初始化 AppInit();
! g k, i: T& v T' Gvoid AppInit(void)
0 q6 J1 @# I( s, I% [{; [8 r G- r: X- y# A( H
/* Structure to initialize IPC (see Ipc.h for definitions) */
/ S" M2 a" ?5 F, F+ B4 L* U struct IPC_cfg ipcCfg = {
1 E8 ^ t* E2 C3 Y( L& n# o IPC_DSP0, /* local processor Id */; |, C* ?( M: |! r$ f
IPC_ARM_HOST, /* remote processor Id */
' R2 e& ^4 V% b2 q# L" a& u2 r7 w IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
: \1 | y- B6 t; j S IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
, x y1 ]" P: S$ t" M2 x NUM_MAX_EVENT, /* maximum number of events to be created */
9 N& m8 T- P9 r" t; @& f &ipcPvMemDsp, /* local side private IPC memory */2 u0 R: p: e( M4 L
&ipcPvMemArm /* remote side private IPC memory */
8 p: G X' Y8 \( y };2 |$ P! w& h" y! [
IntDSPINTCInit();
; U A E' Y, b! i2 q, {: z IPC_init(&ipcCfg);$ m% P: x: [; x2 B# x$ _3 _
IPC_intRegister(C674X_MASK_INT5);) b, g1 O3 [8 Y7 ~# t8 e
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));" |5 a5 n; X! G' G! z
?& N7 X' H- k9 A8 |% V /* Enabling interrupts for DSP C674x CPU */
* b3 w/ M: m4 ?1 ^ IntGlobalEnable(); /* Enable C674x global interrupt */1 C- E7 ?6 r& e5 r% ? y0 b
iAssert (Notify_start()); /* This will enable IPC interrupt */
: H1 I& N8 M/ H# x' w}
4 h; }2 ?5 W4 X6 l7 }( D/ |' e0 N+ w Z4 b
然后是
# K0 x" x! z. c4 A // UART 初始化
* I S9 u2 u+ k" X) |, } UARTInit();& ` B" R! ~. m5 D( D
* B# @- [4 U5 ]: D) _6 n ?# O3 `9 W
// UART 中断初始化
- Z; a6 o& O$ S N' Y) m UARTInterruptInit();
, R( O$ F: C3 I0 f
2 l, T/ W! }! x& T2 u' Z, W% x2 u
T. L; m( r* O# A3 ^void UARTInit(void)& {8 b4 g& _% F/ p2 B
{( r) D; D, X5 J! t& _5 ~: i: u
// 配置 UART0 参数
4 Y) @) ?# u! V+ ]$ K- t // 波特率 115200 数据位 8 停止位 1 无校验位
3 s1 W! L3 c+ Y UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,+ P" L/ H0 W/ v6 c! C! f& |
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
0 e- Y2 L1 v1 k G // 使能 UART0
2 x; u: M0 q2 `* } UARTEnable(SOC_UART_0_REGS);; A) S. Q1 |, J3 x
& L r1 G* J$ R
// 使能接收 / 发送 FIFO
. S/ t1 _ D0 W& j6 D3 W// UARTFIFOEnable(SOC_UART_0_REGS);
2 u3 X" E' [; o6 o6 S1 M! f9 p+ u& @& D8 l, l# R6 J
UARTFIFODisable(SOC_UART_0_REGS);
6 l' `+ t1 w$ M5 _! R5 a1 I( A r8 @
// 设置 FIFO 级别 接收FIFO的级别
( F0 f6 K& `" H8 F2 c; X# _- I// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
% X/ R: E2 r+ }1 v! V}
- a! c0 f2 U! n6 x+ N
d- \) X" k+ T" L; z$ q( C
! Y1 a7 s1 t# q' m1 {( evoid UARTInterruptInit(void)5 f4 e2 ]% m4 H4 a" E; P
{- { ?8 k Y1 U+ G* P" N4 N
IntRegister(C674X_MASK_INT4, UARTIsr);7 R. g; B9 ~4 x0 g G1 {% a5 Q
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);! h7 t* b4 o. `0 d3 k5 c
IntEnable(C674X_MASK_INT4);/ I, x7 q9 X* ]8 h' J; x9 x
, O$ ]2 j% U! U; g7 o, O2 B5 J- L
// 使能中断
' X# I, ]* x8 c unsigned int intFlags = 0;
$ m5 ]; S/ ]* O) y$ R0 b; f! R intFlags |= (UART_INT_LINE_STAT | \
. K' ?: }& A. h5 P! a- H UART_INT_TX_EMPTY | \
" ~1 p6 Y0 b& t: ~ UART_INT_RXDATA_CTI);
1 m7 e$ ^/ l6 [ UARTIntEnable(SOC_UART_0_REGS, intFlags);
& C" A, h( F* f% K0 a9 U2 r}
* E [& M q+ v7 }5 W/ Y, O) Y- A. _6 [$ _
' W) H f( m- P, ~2 [% r
void UARTIsr()
+ K+ B4 E( D9 g! ]6 U2 L{
/ `- U z, ^) T: \3 R: | static unsigned int length = sizeof(txArray);0 `. C* Y' D! x0 g5 n. a1 g, ?9 F
static unsigned int count = 0;! `9 j) k* p$ c1 @
unsigned int int_id = 0;' j* z, b# g" N# c; \7 x
3 Y0 s6 C2 k+ j' o9 I
4 {9 H" S; e) o+ F+ X
0 d! m2 s0 Z$ F2 x2 x }# r' I // 确定中断源) g- p7 k) l, n0 @- M
int_id = UARTIntStatus(SOC_UART_0_REGS);
0 P" j- m+ X; `
% \5 P3 I G% ]. x // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。+ E5 S& U6 {" a: Q
y* w+ @6 a! Z. K! `
7 K7 i; i) @/ I0 l2 C2 A5 Q" a // 清除 UART2 系统中断+ E5 h' b8 b6 a; T6 ]- |. b
IntEventClear(SYS_INT_UART0_INT);. D6 t- K2 n1 r/ u9 ~
& }/ j% P( ?5 e% x
// 发送中断9 U/ J. r- H6 K' f# U# ^
if(UART_INTID_TX_EMPTY == int_id)
5 |$ w5 o7 Q1 e9 f+ m( _ {
8 s! l0 R8 x2 r if(0 < length)
& b7 V, I; u5 \/ e. Z* S6 R/ f {, I! M2 }# e/ {' G
// 写一个字节到 THR
3 C4 {; {) h) F: a$ f- @ UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]); y' l O+ a& `; `; H( V
length--;+ V0 c7 Q s: M- B
count++;" R' v& S9 }! s
}, r& q4 }/ A$ u& l
if(0 == length)/ X6 S! e/ Q* T6 k
{
+ V# ~+ q8 C* S9 ]4 u H // 禁用发送中断2 b! A) v' Y4 _5 }( g- ~+ @
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);% S0 N* G: `8 C; X* ?
}
e& R4 x5 Q1 h3 L, u0 m) @ }2 S5 b+ s. Q( q Z i) `
+ p# Z2 E; ?6 p- f& t* B/ { H // 接收中断
0 L2 R4 `; v, _% g1 D if(UART_INTID_RX_DATA == int_id), e5 O4 k' _% }4 h9 V3 S$ y
{
* c! J/ y' O+ ?5 D if(status_a0==0)5 A4 k, L& H) T2 ?
{6 _. h) t$ s/ f5 h3 Z6 L
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);* s5 A' \; ^- d: r+ ?$ A9 i+ v
if(a[0]=='#') O9 i8 w3 |4 ]$ T* i0 C/ r3 Q
{
* [* _+ a# O2 j+ h3 B status_a0=0x01;' e2 n7 e- q! ?8 E5 H" t: o
status_a1=0x01;7 j/ ~, p" s; Y* F$ `% C z
}
6 i E$ e7 y4 T! A0 ^/ C& b }
1 b. y- Q4 ~- ^3 w- j( l6 k I if(status_a1==0x01)! q2 }4 s8 G" J7 ]" x6 n
{
, Z o2 ?8 z2 n& M* F. r- l0 \ a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);! G6 t7 E, H; ^3 V, E) u
if(a[1]=='R'). v" q0 u! W/ U
{, [- R9 g' k# E6 V, ~9 I
status_a1=0;
% K8 X( \; A/ S Z& k* N/ J7 z status_a2=0x01;
' c8 p& J. e2 P p* q }
7 S4 l, X/ ]. q% f5 Q }9 _1 F- _ U _0 p
if(status_a2==0x01): j$ k' n: D& x: O$ q7 }
{% e. @! X6 j! Q2 n
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);; h& {2 M2 r" L- D% V, w
if(a[2]=='A')8 G h8 s( c& Z% j s; Y( k+ q
{
6 Q3 v# d) k" b: Z+ s0 c status_a2=0;
& ?' N2 S5 K, X8 Q status_a3=0x01;+ o+ P) p& L+ K2 K+ [: b
}
/ _+ x1 R4 W1 j1 x; | }; w" U2 c$ H, E2 E: k
if(status_a3==0x01)
- L- p8 {! Y' }% s" J) K {
X" f' R0 }; K& C5 L6 c a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);+ l4 H" x4 X; N9 b6 ~ R" A) F
if(a[3]=='N'). n+ g3 Q& M u4 i' z2 E
{: k$ l+ _: `* v
status_a3=0;$ @$ ^) ]$ S8 D% {# c' B
status_a4=0x01;
* x" Z9 {' S; X- Y$ C$ E% s }
6 @6 H7 @2 U: [- x }- @2 u1 h9 q$ k' p+ T
if(status_a4==0x01)3 s% n( N( I* S4 ^- d; o
{
* f+ p1 O4 V! R2 r, d a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);3 M: A# x# @" Y8 P9 _) q8 ]) ?+ U; H
if(a[4]=='G')
1 Q5 j! D6 E4 R& t% N) O* p- R' q {" ~+ _3 \+ g, a. u5 H ~: v
status_a4=0;
: n; b6 T( {# s- ` status_a5=0x01;
% \- s- Q( v0 a( v" j6 [ }
" I8 \' f; r f# s/ u2 | }
: u1 K6 M' h- r/ \. [ {. i$ r5 G if(status_a5==0x01)
% G# R9 |" Y2 [/ \5 D( U {5 h/ z% T/ x, @6 W, [; ^
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);; g7 u" B5 z; D% `/ i- C& k! x, d
if(a[5]=='E')* u7 p; r: R! ]% ^ O
{; c4 f7 g( h# C9 A& M* g/ _
status_a5=0;
" T, A, x! c8 t' a e7 K6 F$ M- G status_OK=0x01;3 h) A3 {% k5 B+ a1 z
}3 l- f+ p$ d( b; b
}( {; m$ K! e* ^1 f; O' m( T& C
if(status_OK==0x01), V5 {* k' ]/ B# v7 s
{: x# g+ H H) N' `( {- D) K
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);* z2 {3 S8 U& W9 b
lengthrx++;
/ C+ A: ?7 Y& m3 ^/ h" l if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值), V$ f# \% Z [* X/ X
{: w0 M1 H# i: T/ H" D$ c \
RecState=0x01;! K1 O, j; ~- j: l8 j, n v: m( c, [1 c
}3 \% h4 H1 z' E- V- ]$ Y
}% }- p$ X8 t# y
$ j4 Z! x3 i; Z5 q2 H1 c7 i
}' j( h, Q0 F+ k& W
/ o$ z! _' n) b5 b6 r D/ i: [
// 接收错误
/ ^- ~) Z) _# L6 H if(UART_INTID_RX_LINE_STAT == int_id)
7 J! A8 `* {9 m9 ~ {
N n" i8 f0 \ while(UARTRxErrorGet(SOC_UART_0_REGS))
$ i, j& `# \; l& i' g1 j. ]2 t# b {
9 \2 e) M% z- `, Y+ w1 E // 从 RBR 读一个字节: O+ J% e1 J4 G
UARTCharGetNonBlocking(SOC_UART_0_REGS);
0 d& y+ u, d5 d, ` }' H) e1 K, a( \$ Z/ }/ o
}
, R4 s$ p6 U$ s0 c! Q- e+ E( _9 v6 R& E5 T) ]: \3 e
return;- L; J# }6 c: W# c! c# X, F
}* X/ U' K$ b& r; X" s& _; k3 R
- P. [4 U- q* d) ?" Y
0 P& U5 [5 `0 _
* c' j- b0 H- J% P8 k: o4 j |
|