通⽤接⼝协议(串⼝,iic,spi,can,TCPIP协议) UART
UART通信⽅式:异步串⾏全双⼯通信⽅式
异步通信:有通信速度要求。
UART通信速度由两个设备⾃⼰决定。
UART通信有⼀个数据格式。
UART通信四要素:波特率、数据位长度、校验位、停⽌位。
芯⽚通信过程中将这四个要素配好,完成了⼀⼤半功能。
备注:⾃⼰⽤过的开发版:STM32F407VG
IIC协议:
iic有两根线:⼀根时钟线,⼀个数据线。
iic有⼀个起始信号:时钟线拉⾼,数据从⾼电平到低电平,形成iic的起始信号
iic是如何发送数据的:起始信号+设备地址+数据+结束信号
7.1 字节格式
发送到 SDA 线上的每个字节必须为 8 位每次传输可以发送的字节数量不受限制每个字节后必须跟
⼀个响应位⾸先传输的是数据的最⾼位 MSB 见图 6
如果从机要完成⼀些其他功能后例如⼀个
内部中断服务程序才能接收或发送下⼀个完整的数据字节可以使时钟线 SCL 保持低电平迫使主机进⼊
等待状态当从机准备好接收下⼀个数据字节并释放时钟线 SCL 后数据传输继续
7.2 响应
数据线低电平时产⽣应答,可继续发送,不然应为⾼电平,主机产⽣结束条件
项⽬中的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);
//等待测量完成tcpip协议pdf
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是串⾏外设接⼝(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⽐特的模拟前端处理器
16-Bit CCD/CIS Analog Signal Processor
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 的⾼性能和可靠性已被认同,并被⼴泛地应⽤于⼯业⾃动化、船舶、医疗设备、⼯业设备等⽅⾯。
CAN-bus 主要特性
1) 多主控制。
在总线空闲时,所有的单元都可以开始发送消息(多主控制)。
最先访问总线的单元可获得发送权。
多个单元同时发送时,发送⾼优先级 ID 消息的单元可获得发送权。
2) 消息的发送
在 CAN 协议中,所有的消息都以固定的格式发送。总线空闲时,所有与总线相连的单元都可以
开始发送新的消息。两个以上的单元同时发送消息是,根据标⽰符(Identifier 以下称 ID)决定
优先级。ID 并不是发送的⽬的地址,⽽是表⽰访问总线的消息的优先级。
两个以上的单元同时
开始发送消息时,对各消息 ID 的每个位进⾏逐个仲裁。仲裁获胜(被判定为⾼优先级)的单元
可继续发送消息,仲裁失利的单元则⽴刻停⽌发送⽽转为接收模式。
4) 通信速度
根据⽹络的规模,可设置合适的通信速度。在同⼀⽹络中,所有单元必须设置统⼀的通信速度
1.6 CAN 总线物理层的定义
CAN 协议经 ISO 标准后,有 ISO11898 标准和 ISO11519-2 标准两种。ISO11898 标准和 ISO11519-2 标准
对数据链路层定义相同,但对物理层定义不同。如图 1.4。
1) 关于 ISO11898
ISO11898 是通信速度为 125kbps~1Mbps 的 CAN ⾼速通信标准。
2) 关于 ISO11519
ISO11519 是通信速度为 125kbps 以下的的 CAN 低速通信标准。
8. CAN 总线协议
8.1 帧的种类
通信是通过以下 5 种类型的帧进⾏的。
• 数据帧
• 遥控帧
• 错误帧
• 过载帧
• 帧间隔
另外,数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有 11 个位的标识符(Identifier: 以下称 ID),扩展格式有 29 个位的 ID。
各种帧的⽤途如表 7 所⽰,各种帧的构成如图 11~图 15 所⽰。
表 7. 帧的种类及⽤途
帧 帧⽤途
数据帧 ⽤于发送单元向接收单元传送数据的帧。
遥控帧 ⽤于接收单元向具有相同 ID 的发送单元请求数据的帧。
错误帧 ⽤于当检测出错误时向其它单元通知错误的帧。
过载帧 ⽤于接收单元通知其尚未做好接收准备的帧。
帧间隔 ⽤于将数据帧及遥控帧与前⾯的帧分离开来的帧。
8.2 数据帧
数据帧由 7 个段构成。
数据帧的构成如图 16 所⽰。
(1) 帧起始
表⽰数据帧开始的段。
(2) 仲裁段
表⽰该帧优先级的段。
(3) 控制段
表⽰数据的字节数及保留位的段。
(4) 数据段
数据的内容,可发送 0~8 个字节的数据。
(5) CRC 段
检查帧的传输错误的段。
(6) ACK 段
表⽰确认正常接收的段。
(7) 帧结束
表⽰数据帧结束的段。
下⾯对帧的构成进⾏说明。
项⽬中⽤到的CAN。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论