MATLAB与DSP串口通讯并实时显示图像
一、准备工作
在ccs中编写关于SCI发数据的代码,将数据存写到SCI的端口。然后将串口转USB通讯线连接在电脑上,并确认已连接上电脑(在设备管理器的端口中观察com口)。
二、CCS中代码主要是SCI的编写
SCI读写数据头文件好源文件如下::
-
头文件
#ifndef SCI2MATLAB_H_ #define SCI2MATLAB_H_ #include "DSP280x_Device.h" // DSP2833x Headerfile Include File #include "DSP280x_Sci.h" #include<string.h> #include "DSP280x_Examples.h" // DSP2833x Examples Include File 注:头文件有顺序要求如sci要引用device,device必须在前面 #define SCIA 0x1 #define SCIB 0x2 void intsci(Uint16 channel); void scisendata(Uint16 channel,Uint16 data); void intpietable(); double scisendchar(Uint16 channel,double *listdata); Uint16 scireceive(Uint16 channel); interrupt void sciaRX(void); interrupt void sciaTX(void); interrupt void scibRX(void); interrupt void scibTX(void);
#endif /* SCI2MATLAB_H_ */
-
源文件程序
#include “DSP280x_Device.h” // DSP2833x Headerfile Include File
#include “DSP280x_Sci.h”
#include<string.h>
#include “DSP280x_Examples.h” // DSP2833x Examples Include File 注:头文件有顺序要求如sci要引用device,device必须在前面
#include “SCI2MATLAB.h”
Uint16 Data;
void intpietable()
{
intsci(SCIA); //初始化SCIA设置
intsci(SCIB);
EALLOW;
PieVectTable.SCIRXINTA=&sciaRX;
PieVectTable.SCITXINTA=&sciaTX; //将两个中断地址放在中断向量列表中
PieVectTable.SCIRXINTB=&scibRX;
PieVectTable.SCITXINTB=&scibTX; //将两个中断地址放在中断向量列表中
EDIS;
IER|=M_INT9; //使能CPU中断
PieCtrlRegs.PIECTRL.bit.ENPIE=1; //使能中断向量表,地址从向量表中提取
PieCtrlRegs.PIEIER9.bit.INTx1=1;
PieCtrlRegs.PIEIER9.bit.INTx2=1; //使能PIE中断
PieCtrlRegs.PIEIER9.bit.INTx3=1;
PieCtrlRegs.PIEIER9.bit.INTx4=1; //使能PIE中断
EINT; //使能全局中断
ERTM;
}
void intsci(Uint16 channel)
{
if(channelSCIA)
{
InitSciaGpio();
SciaRegs.SCICCR.all=0x07;
SciaRegs.SCICTL1.all=0x03;
#if(CPU_FRQ_150MHZ)
SciaRegs.SCILBAUD=0x00E7;
SciaRegs.SCIHBAUD=0x0001;
#endif
#if(CPU_FRQ_100MHZ)
SciaRegs.SCILBAUD=0x0044;
SciaRegs.SCIHBAUD=0x0001;
#endif
SciaRegs.SCICTL2.bit.RXBKINTENA=1;
ScibRegs.SCICTL2.bit.TXINTENA=1;
SciaRegs.SCICCR.bit.LOOPBKENA=1;
SciaRegs.SCICTL1.bit.SWRESET=1;
}
if(channelSCIB)
{
InitScibGpio();
ScibRegs.SCICCR.all=0x07;
ScibRegs.SCICTL1.all=0x03;
#if(CPU_FRQ_150MHZ)
ScibRegs.SCILBAUD=0x00E7;
ScibRegs.SCIHBAUD=0x0001;
#endif
#if(CPU_FRQ_100MHZ)
ScibRegs.SCILBAUD=0x0044;
ScibRegs.SCIHBAUD=0x0001;
#endif
ScibRegs.SCICTL2.bit.RXBKINTENA=1;
ScibRegs.SCICTL2.bit.TXINTENA=1;
ScibRegs.SCICCR.bit.LOOPBKENA=1;
ScibRegs.SCICTL1.bit.SWRESET=1;
}
}
void scisendata(Uint16 channel,Uint16 data)
{
if(channelSCIA)
{
SciaRegs.SCITXBUF=data;
while(SciaRegs.SCICTL2.bit.TXRDY0);
}
if(channelSCIB)
{
ScibRegs.SCITXBUF=data;
while(ScibRegs.SCICTL2.bit.TXRDY0);
}
}
double scisendchar(Uint16 channel,double *listdata)
{
Uint16 i;
i=0;
if(channelSCIA)
{
SciaRegs.SCICTL2.bit.TXINTENA=0; //关闭中断,避免SCI发送数据是一个字符一个字符发送
while(listdata[i]!=’\0’) //直到字符结束停止循环
{
scisendata(SCIA,listdata[i]);
i++;
}
SciaRegs.SCICTL2.bit.TXINTENA=1; //开启中断,并在字符串传送完产生中断
}
if(channelSCIB)
{
ScibRegs.SCICTL2.bit.TXINTENA=0;
while(ScibRegs.SCITXBUF!=’\0’)
{
scisendata(SCIB,listdata[i]);
i++;
}
ScibRegs.SCICTL2.bit.TXINTENA=1;
}
return *listdata;
}
Uint16 scireceive(Uint16 channel)
{
Uint16 data;
if(channelSCIA)
{
data=SciaRegs.SCIRXBUF.all;
}
if(channelSCIB)
{
data=ScibRegs.SCIRXBUF.all;
}
return data;
}
interrupt void sciaRX(void)
{
Data=scireceive(SCIA);
PieCtrlRegs.PIEACK.all=PIEACK_GROUP9;
}
interrupt void sciaTX(void)
{
PieCtrlRegs.PIEACK.all=PIEACK_GROUP9;
}
interrupt void scibRX(void)
{
Data=scireceive(SCIB);
PieCtrlRegs.PIEACK.all=PIEACK_GROUP9;
}
interrupt void scibTX(void)
{
PieCtrlRegs.PIEACK.all=PIEACK_GROUP9;
}
三、MATLAB程序
3.1主程序
delete(instrfindall('Type','serial'));
clc;
global t;
global x;
global m;
global ii;
t = [];
m = [];
ii = 1;
x = 0;
p = animatedline('Color','r','LineWidth',3,'LineStyle','-.','Marker' ,'*','MarkerSize',3);
% axis([x x+500 0 8]);
grid on;
%%
try
s=serial('com7');
catch
error('cant serial');
end
set(s,'BaudRate', 9600,'DataBits',8,'StopBits',1,'Parity','none','FlowControl','none');
% s.BytesAvailableFcnMode = 'terminator';
s.BytesAvailableFcnMode='byte';%中断触发事件为'bytes-availableEvent'
s.BytesAvailableFcnCount=1;%接收缓存 区每收到1个字节时,触发回调函数
s.BytesAvailableFcn ={@callback,p} ;%指定函数回调
fopen(s);
imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',1);
pause;
fclose(s);
delete(s);
clear s
close all;
3.2回调程序
function callback(s,~,p)
global t;
global x;
global m;
global ii;
out =fread(s,1);%ASCII方式时用fscanf,二进制用fread
data = double(out);
t = [t ii];
m = [m data];
addpoints(p,t(ii),m(ii));
drawnow limitrate
x = x + 1;
axis([x-500 x+500 0 10]);
ii=ii+1;
end
四、结果
只显示了动态的一部分