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。