通用接口协议(串口,iic,spi,can,TCP/IP协议)
UART
UART通信方式:异步串行全双工通信方式
异步通信:有通信速度要求。
UART通信速度由两个设备自己决定。
UART通信有一个数据格式。

UART通信四要素:波特率、数据位长度、校验位、停止位。
芯片通信过程中将这四个要素配好,完成了一大半功能。
备注:自己用过的开发版:STM32F407VG
IIC协议:
iic有两根线:一根时钟线,一个数据线。
iic有一个起始信号:时钟线拉高,数据从高电平到低电平,形成iic的起始信号
iic是如何发送数据的:起始信号+设备地址+数据+结束信号

项目中的iic:HDC2010、DAC5574
HDC2010:它是一个测量环境温湿度的一个芯片(IC),湿度和温度数字传感器
8位的一个寄存器
使用过程如下:
使用iic进行寄存器的初始化:复位、关闭中断、启动测量寄存器
//等待测量完成
//去读取温湿度寄存器的数据。
void HDC2010Init(void)
{
HDC2010WriteReg(HDC2010_RESET_DRDY_INT_CONF,SOFT_RES_NORMAL|ODR_1_120HZ|HEAT_EN_OFF|DRDY_OR_INT_EN_HIGH_Z);
//正常复位、1/120输出速度、DRDY/INT_EN 引脚输出为高阻,不中断
HDC2010WriteReg(HDC2010_INTERRUPT_MASK,DRDY_MASK_DISABLE|TH_MASK_DISABLE|TL_MASK_DISABLE|HH_MASK_DISABLE|HL_MASK_DISABLE);
//中断掩码寄存器设置,所有中断关
HDC2010WriteReg(HDC2010_MEASUREMENT_CONF,TEM_RES_14BIT|HUM_RES_14BIT|MEAS_CONF_TEM_HUM|MEAS_TRIG_START);
//测量寄存器设置,温度14bit,温湿度均使用、并且启动测量
}
void HDC2010Read(void)
{
unsigned short temperture=0;
unsigned short humidity=0;
float temperture_temp=0;
float humidity_temp=0;
while(HDC2010ReadReg(HDC2010_INTERRUPT_DRDY)&DRDY_START_READAY!=DRDY_START_READAY);
//等待测量完成
temperture=HDC2010ReadRegU16(HDC201_TEMPERATURE_LOW);
humidity=HDC2010ReadRegU16(HDC201_HUMIDITY_LOW);
//printf("temperture=%d\n",temperture);
//printf("humidity=%d\n",humidity);
temperture_temp=(float)(((float)temperture)*165/65536) - 40;
humidity_temp=(float)(((float)humidity)*165/65536);
if(temperture_temp<0)
printf("00");
else
printf("%.2d",(int)temperture_temp);
//printf("%d\n",(int)humidity_temp);
}
DAC5574
是一个模拟电压输出的芯片。作用是,作为lsu(激光扫描单元)的参考电压
原理图:在产品的作用:作为lsu(激光扫描单元)的参考电压
//通过iic往DAC写数据,测模拟电压
//有四路,一路一路的写,关掉就写0
unsigned char Write_DAC(unsigned char wdata,unsigned char ctl)
{
if(!Start()){
Stop();
return 10;//FAILURE
}
SendByte(0x98);
if(!WaitAck()){
Stop();
return 20;//FAILURE
}
SendByte(ctl);
if(!WaitAck()){
Stop();
return 21;//FAILURE
}
SendByte(wdata);
if(!WaitAck()){
Stop();
return 22;//FAILURE
}
SendByte(0);
if(!WaitAck()){
Stop();
return 23;//FAILURE
}
Stop();
return 1;
}
SPI通信协议(SPI总线)学习
SPI是串行外设接口(Serial Peripheral Interface)的缩写。是 Motorola 公司推出的一
种同步串行接口技术,是一种高速的,全双工,同步的通信总线。
支持全双工通信
通信简单
数据传输速率块
没有指定的流控制,没有应答机制确认是否接收到数据,
所以跟IIC总线协议比较在数据可靠性上有一定的缺陷。
它们是SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。
2):需要说明的是,我们SPI通信有4种不同的模式,不同的从设备可能在出厂是就是配
置为某种模式,这是不能改变的;但我们的通信双方必须是工作在同一模式下。
所以有效状态就是SCLK处于高电平时
所以有效状态就是SCLK处于低电平时
表示数据采样是在第1个边沿,数据发送在第2个边沿
表示数据采样是在第2个边沿,数据发送在第1个边沿
需要注意的是:我们的主设备能够控制时钟,因为我们的SPI通信并不像UART或者IIC通信
那样有专门的通信周期,有专门的通信起始信号,有专门的通信结束信号;所以我们的
SPI协议能够通过控制时钟信号线,当没有数据交流的时候我们的时钟线要么是
保持高电平要么是保持低电平。
项目中的spi:ht82v38
是一个16比特的 模拟前端处理器
void WriteADC(int addr,int data)
{
int i;
addr = addr<<12;
data = data + addr;
//data = 0;
SLOAD_L;
for(i=0;i<16;i++){
if(data&0x8000){
SDATA_H;
}
else{
SDATA_L;
}
data = data <<1;
udelay(4);
SCLK_H;
udelay(4);
SCLK_L;
}
SLOAD_H;
}
int ReadADC(int addr)
{
int i ,data;
addr = addr<<12;
addr = addr + 0x8000;
data = 0;
SLOAD_L;
for(i=0;i<7;i++){
if(addr & 0x8000){
SDATA_H;
}
else{
SDATA_L;
}
addr = addr <<1;
udelay(2);
SCLK_H;
udelay(2);
SCLK_L;
}
for(i=7;i<16;i++){
data = data <<1;
udelay(2);
if(GPIO_MFP_1_read(10)){
data = data + 1;
}
SCLK_H;
udelay(2);
SCLK_L;
}
SLOAD_H;
return data;
}
以前做的项目补充。
CAN协议:
现在,CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。
1) 多主控制。
在总线空闲时,所有的单元都可以开始发送消息(多主控制)。
最先访问总线的单元可获得发送权。
多个单元同时发送时,发送高优先级 ID 消息的单元可获得发送权。
2) 消息的发送
在 CAN 协议中,所有的消息都以固定的格式发送。总线空闲时,所有与总线相连的单元都可以
开始发送新的消息。两个以上的单元同时发送消息是,根据标示符(Identifier 以下称 ID)决定
优先级。ID 并不是发送的目的地址,而是表示访问总线的消息的优先级。
两个以上的单元同时
开始发送消息时,对各消息 ID 的每个位进行逐个仲裁。仲裁获胜(被判定为高优先级)的单元
可继续发送消息,仲裁失利的单元则立刻停止发送而转为接收模式。
4) 通信速度
根据网络的规模,可设置合适的通信速度。在同一网络中,所有单元必须设置统一的通信速度
项目中用到的CAN。

浙公网安备 33010602011771号