|
|
OMAPL138双核通信,现在需要DSP核中的UART0接口。% Q' D# u% d* Q. ^
我是在DSP初始化这不太明白。
0 \+ |! j b: b r初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。7 O: i4 c$ |/ g0 Q# p" L2 ?
6 {% E; A8 X$ k- H7 E; s) g
' Y) U4 W* }* h* e& {
首先 PSCInit();//UART0使能
+ `+ P8 X7 M) o5 h; f6 _void PSCInit(void)- |7 K3 z4 W4 M7 q
{" Z3 ]! c6 D* O+ w
// 对相应外设模块的使能也可以在 BootLoader 中完成
* d4 @% @! R5 q* q/ r- U8 ~ // 使能 UART0 模块
8 w. U$ R5 w5 r PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);# e# e/ O9 Q2 m& E
}9 t! N' z, Q- C5 X5 T
) G4 X1 h1 J3 O8 }+ B6 G+ J8 u T! r# C* r( U
然后是 双核通信的初始化 AppInit();1 M! e/ X; a3 R3 L% C/ e+ ~- n
void AppInit(void)
8 x6 C, F- J2 O; i+ k! s- O F{% K: u# B5 J% U' N
/* Structure to initialize IPC (see Ipc.h for definitions) */5 I' A; d0 L& V7 N" {" F4 j7 e
struct IPC_cfg ipcCfg = {
( z' c0 r9 H* X$ u( |" Y IPC_DSP0, /* local processor Id */
/ ~& O' e) J+ l6 L& g IPC_ARM_HOST, /* remote processor Id */
5 Z5 E2 W( u3 E9 f9 l6 j2 q IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */3 g+ p+ ?0 v P5 |/ }- T
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
+ R! f. c' n2 \. I+ Y NUM_MAX_EVENT, /* maximum number of events to be created */& X( @, N! t1 e: y+ m( O
&ipcPvMemDsp, /* local side private IPC memory */ `$ E& Z7 R. V* L
&ipcPvMemArm /* remote side private IPC memory */
9 I4 \% a# F; A- w };3 F% z( i" Z! C, a8 V7 |
IntDSPINTCInit();
- y* x( i& p, O1 o8 h/ @3 m2 ?. W. H9 X IPC_init(&ipcCfg);
- c9 ?' m2 m n% j/ e IPC_intRegister(C674X_MASK_INT5);
1 `* g# y3 `" b# ]2 X" K/ Z iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));4 k ~! i. P# z. D
: E4 M1 G) }; A& i! _ /* Enabling interrupts for DSP C674x CPU */* J/ K5 b1 @1 _% i2 \8 z- W. u
IntGlobalEnable(); /* Enable C674x global interrupt */3 K1 K# }* a8 [) ^$ q
iAssert (Notify_start()); /* This will enable IPC interrupt */% |5 c2 i2 s$ ^+ ^3 K
}
3 k) C6 ~# v L/ r2 I/ V v* p$ |4 l/ {* O& i
然后是 4 @0 F; L, N4 T! a# J4 A0 a
// UART 初始化
?! f$ N- C3 T+ N! I" M, ?; o UARTInit();2 W) G# n+ t+ H
. A1 G$ E! F' I4 u }' z // UART 中断初始化3 T: E( x3 m- P5 W& [& S$ h& k: ^
UARTInterruptInit();
# @ x7 O: u: U i4 J) b6 R K
1 X' W! {% R; N4 `
: l" ]) B5 i r. V* T/ c2 q d5 ^void UARTInit(void)& H% V" ^: G+ z8 W! ]
{$ t3 w2 p" {8 [. l1 }. n0 r
// 配置 UART0 参数- _3 b2 X: w4 _
// 波特率 115200 数据位 8 停止位 1 无校验位
T$ Q- b; Z" Y% j6 L* z UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,3 J$ S. p# z) S& |
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
" R( k3 L/ L) ?+ O) T% i" Q( V$ Q // 使能 UART0
2 t9 E g7 ^# d0 X UARTEnable(SOC_UART_0_REGS);
0 R, g: Q+ g" y M* q$ ~+ f6 X& o/ l5 b% h% M# o, m6 q- d
// 使能接收 / 发送 FIFO
) R$ G& T) L: _( r// UARTFIFOEnable(SOC_UART_0_REGS);# f6 O$ a+ i& T& t8 S/ u+ B
+ n& s# G/ f: K9 A4 l9 K3 ? W( k
UARTFIFODisable(SOC_UART_0_REGS);. S& ~# e9 }) h
6 j; `: J, o5 v# r$ _
// 设置 FIFO 级别 接收FIFO的级别
( l" p3 y) K8 M2 Q' h// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);6 H J7 o) p" W
}
$ [! Q$ Q) x" ^3 i" Z& C ~0 w
4 g: v1 c- O- C7 j& n8 y$ x2 O8 h) \8 N* Q
void UARTInterruptInit(void)
. f; ]% `8 u9 E% o0 @{& s* j/ B9 L2 v+ z
IntRegister(C674X_MASK_INT4, UARTIsr);
+ w! s y' j7 H7 n. | IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
@ k p. Y# M0 w- I" q% c- l IntEnable(C674X_MASK_INT4);" o r& Y2 b1 p3 |" r& d
# _6 x+ H# C# E
// 使能中断
6 I/ p# G$ C& } unsigned int intFlags = 0;
! K( @0 t" e2 O' k intFlags |= (UART_INT_LINE_STAT | \
n* n4 o/ Z R8 W3 O$ A7 A+ l$ |6 w3 a UART_INT_TX_EMPTY | \( {2 n A% B2 D% w
UART_INT_RXDATA_CTI);
- b6 s2 j: z$ L3 `# g; b6 G9 q0 Q UARTIntEnable(SOC_UART_0_REGS, intFlags);" l: A: k, o+ p6 H; [. w
}
6 v/ o8 K! V/ f6 `
( p" N, r# m) Q. I5 f9 |/ g( N3 z. l3 M
void UARTIsr(); ~: m8 Z3 O; x( A" }" ^8 ^: `
{3 s9 Y7 u" Z( ]6 c$ S
static unsigned int length = sizeof(txArray);
' ~' E" {- `& q" e0 T$ |: q static unsigned int count = 0;
$ ~! B+ ?- d1 X6 C1 ^ unsigned int int_id = 0;; m/ l' v3 Y& e; E% t% a2 X2 ~7 q
+ d {3 k+ k9 u' k/ @. ?* _% A# u$ J, ^/ g( }1 j" Q
4 D; p3 n/ F, P
// 确定中断源
# n8 S7 I! \- `2 ?3 K6 F8 \ int_id = UARTIntStatus(SOC_UART_0_REGS);
" `* m/ U: _" c: P- ] L' D( N- A' V$ t# k, }7 {! y+ v" }2 y
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
5 O* s/ N9 t1 K) T) ?2 }' d! Q) D& Z$ c+ P
! i& y2 F# L, S# k2 Y: T! c3 h
// 清除 UART2 系统中断* e2 S$ L9 w: j. j& }
IntEventClear(SYS_INT_UART0_INT);
# }% B2 ?: e+ t, I5 ^2 E' M
! o1 ?: M! J' v+ U1 i // 发送中断
& {* u/ W6 T: s. \+ ^ if(UART_INTID_TX_EMPTY == int_id)
* f7 Z2 U( T- L2 O$ b& W {2 Q* ~6 J* x x5 t* }
if(0 < length)
3 N1 d, A( ^; E: |$ `) U! l {- i) {) B9 K, i7 [% c
// 写一个字节到 THR, s2 E( d: C: {! H
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
1 w: l0 [% e$ u8 T length--;) Z) I! q/ `6 j. |
count++;
1 u# X [7 r {# m- m0 ` }
& L0 u2 X0 d; T# J: h1 z if(0 == length)( X: n+ S9 }" `% ]# c9 s6 f
{
& ?: E/ j% F* Q // 禁用发送中断
7 t' E; B% e8 S$ y UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
4 d, N0 D# F- O( [ }- f8 ` i# J8 B7 e% D% u. p
}5 y6 c- j3 O4 Q) W0 J% N. Y% u
( x8 O; E. {( l8 o
// 接收中断3 Z/ n/ @( A7 A) ?; P
if(UART_INTID_RX_DATA == int_id)8 k- T# u' J p8 X5 F( \
{
& Z0 ~% j0 z# `# p. ? if(status_a0==0)) e. E. l3 Y' M
{
+ e5 B% [3 O4 r3 X! S" }! f a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);8 \0 I" o" `0 @# W2 O/ m* H4 f
if(a[0]=='#')
) Z% p2 ^" N) [- F0 U+ ?! A {
8 Z+ E1 N8 a* I status_a0=0x01;
$ t: K& F7 C( y% _' X/ g: | status_a1=0x01;
( ?0 R7 h) l) N) h5 P }$ V/ \; \5 H' R. v# p
}2 {. ?- v6 Z: a5 U2 x
if(status_a1==0x01)' f5 { ^7 r( u) J& F. s# E7 s) Q O
{# p6 \4 b$ D' g) e% ^
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);# ?: O$ y$ R9 N
if(a[1]=='R')5 o- \# b7 a* O: F/ [: Z+ | C( W
{, ~/ X, ~. X0 @) q. l7 A
status_a1=0;
2 R9 r) J2 s0 u: w status_a2=0x01;" m' o5 u2 k6 k
}
/ r5 U& X* B4 H/ z0 A, \" \ }
: G+ w8 C8 p7 Z4 f8 c0 ]6 s' d if(status_a2==0x01)
' l9 M4 {4 w8 ~ {1 G7 U! i# x0 \; e2 U
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
8 H1 D2 g b; u3 ^$ C: p8 t/ h+ _' [ if(a[2]=='A')/ N8 `5 {3 b1 O/ P! x& ]
{9 O3 M0 g8 O b: j1 h
status_a2=0;
- |! x, s& B+ R1 @9 W4 c& u status_a3=0x01;- {/ k/ ^' G# j: b9 ~. L
}( w0 L9 q, t: b9 E
}
* N% p% V$ x1 [ if(status_a3==0x01)
9 {6 v6 D5 [5 p$ G {5 y2 a* L5 m4 U. s3 |9 h- l
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
& `7 g3 O; Z7 j if(a[3]=='N')
1 M' g, {+ }* m {
# ~4 o! S$ N# G- L9 @* q# _# X status_a3=0;+ R5 a' J) U& @ K: x j
status_a4=0x01;
8 c! e9 ]0 X5 b; l C) k }4 r* C+ R# h Y/ \( R: v
}3 y& A; _* S) ?$ b0 r
if(status_a4==0x01)
+ B) z$ A" m; t( h, B$ f: N0 p {
( W$ k' r+ O0 `( [ G" n& q: q a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);3 W$ F" e: P& y1 L8 T, N: ~0 D
if(a[4]=='G')1 a+ F; u1 y7 T* @+ \ `
{
! Y) r9 D& ]: f* P status_a4=0;
7 e$ b9 n% E8 p" b8 U& {. s5 U status_a5=0x01;, C8 L" I! M8 C$ N" E5 N- I3 B; n0 p
}7 m* g1 G5 P! `, e9 E6 \; `
}
# n* j& _; w9 O5 M& \. C6 R if(status_a5==0x01)
) y0 C9 x$ D; g2 A! J9 m1 R {) X: m2 a% O( Y* x& ~* }
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);$ t" _" Z- ~4 U
if(a[5]=='E')5 k1 o9 k- Q! _9 T3 Q
{$ m0 T! s$ A6 |$ x* K( k% L2 E
status_a5=0;& U8 E+ {) G' E! z
status_OK=0x01;
5 T# U s8 }1 J5 f% Y8 R }
; r5 x# @/ H; R. D' z4 I( T. Y }" w0 R! b# {. c$ j. u3 t- P
if(status_OK==0x01)
/ ]& h+ R: P5 y# d {
$ `, h( D# Q& r1 `, D$ G rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);8 o* i* ?+ n/ Y- R* I8 U
lengthrx++;
- e+ ^' P+ O6 m T; Y0 I4 @/ p if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)2 I& E& V m. E3 O; [
{; g- K. N9 J& ^! W4 b; C
RecState=0x01;! i+ n" c- S+ V
}
8 g, C( i8 e' R" ^/ N }
1 v4 w# N/ m. _* N9 ?
2 e9 J4 ]+ q+ x8 K" h& e }) ?3 m8 J K7 M# D
8 g7 Y( J: _* W1 E* B // 接收错误% f5 D3 i3 P. {; q
if(UART_INTID_RX_LINE_STAT == int_id)) `9 B! v. o; f+ T
{ j; {. v- v% c
while(UARTRxErrorGet(SOC_UART_0_REGS))) q$ {* B9 V. D9 J; d
{
- ]/ [# {8 B5 c2 W // 从 RBR 读一个字节
$ V* X. K% C* d; D" W5 v( t- n4 L3 i: `( y UARTCharGetNonBlocking(SOC_UART_0_REGS);" V- q, S3 J5 k, {. B; C
}
) _& J {* I+ ?6 N3 V5 z3 j- ?* S }
5 U- M0 t$ t" ? n8 e
- a' X0 M0 g/ G8 [$ O4 ^ return;# f `% x: b4 _
}" n* S* G: n; f
1 k" T% D R& j; j4 Y# Q0 B
9 V- P) V( v+ ~+ Z
1 h2 N' x- y( C3 v+ O/ S
|
|