项目经历
基本将大学期间的所有的讲出来就行,说负责的以及其技术点,说出来就差不多了
通信协议
IIC
IIC协议是什么?
一般IIC的话是可以挂载多个外接设备的,他的并行协议有8080,6060
IIC协议是属于半双工、串行的协议,常适用于近距离的低速的芯片之间的通信。
IIC的通信过程
接线:IIC的线有俩条SDA和SCLK
SDA是数据线,用于传输数据
SCLK是时钟信号线,用于产生时钟频率,控制时序,实现协议过程。
由此看出,IIC是半双工的
一般我们用的是软件方式模拟IIC协议
一般而言:
IIC通信过程为
设置IIC起始信号,而后开始等待应答,而后开始应答,传输信号,最后终止信号
起始信号
当SCL为高电平时,SDA由高电平转为低电平为起始条件
等待应答
等待应答又为ACK应答,应答有俩边,一边是从机应答,另外一边是主机应答
从机应答: 当1个字节的数据从高到低传输完毕后,从设备将SDA拉低,这样主设备检测到SDA被拉低就相当于收到了一个来自从设备的应答,这样主设备,这样主设备才知道一个字节被传输完毕
主机应答: 主机向从机发送了读数据的指令后,从机必然要从主机返回数据,故而主机接收从机的数据的过程,称为主机应答
数据传输
SDA的数据在SCL高电平期间被写入从机。所以SDA的数据变化要发生在SCL低电平期间
停止条件
当SCL为高电平时,SDA由低电平转为高电平为停止条件
例程代码:
起始条件:
void I2C_START(void)
{
/* 当SCL高电平时,SDA出现一个下降沿表示I2C总线启动信号 */
I2C_SDA_H;
I2C_SCL_H;
i2c_Delay();
I2C_SDA_L;//SDA先产生下降沿
i2c_Delay();
I2C_SCL_L;
i2c_Delay();
}
停止条件:
void I2C_STOP(void)
{
/* 当SCL高电平时,SDA出现一个上升沿表示I2C总线停止信号 */
I2C_SDA_L;
I2C_SCL_H;
i2c_Delay();
I2C_SDA_H;//SDA先产生上升沿
}
主设备等待来自从设备的应答:
//返回值:1:接收应答失败,0:接收应答成功
uint8_t I2C_Wait_Ack(void)
{
uint8_t re;
I2C_SDA_H; /* CPU释放SDA总线 */
i2c_Delay();
I2C_SCL_H; /* CPU驱动SCL = 1, 此时器件会返回ACK应答 */
i2c_Delay();
if (I2C_SDA_STATE !=0) /* CPU读取SDA口线状态 */
{
re = 1;
}
else
{
re = 0;//从设备主动将SDA拉低,则接收到应答
}
I2C_SCL_L;
i2c_Delay();
return re;
}
主设备应答:
void I2C_ACK(void)
{
I2C_SDA_L; /* CPU驱动SDA = 0 */
i2c_Delay();
I2C_SCL_H; /* CPU产生1个时钟 */
i2c_Delay();
I2C_SCL_L;
i2c_Delay();
I2C_SDA_H; /* CPU释放SDA总线 */
}
主设备非应答:
void I2C_NACK(void)
{
I2C_SDA_H;
i2c_Delay();
I2C_SCL_H;
i2c_Delay();
I2C_SCL_L;
i2c_Delay();
}
备注,上述代码的时钟信号为
i2c_Delay();
延时的使用产生了周期性的SCL时钟。
static void i2c_Delay(void)
{
uint8_t i;
//循环次数为10时,SCL频率 = 240KHz
for (i = 0; i < 10; i++);
}
发送一个字节:
void I2C_SendByte(uint8_t _ucByte)
{
uint8_t i;
/* 先发送字节的高位bit7 */
for (i = 0; i < 8; i++)
{
if (_ucByte & 0x80)
{
I2C_SDA_H;
}
else
{
I2C_SDA_L;
}
i2c_Delay();
I2C_SCL_H;
i2c_Delay();
I2C_SCL_L;
if (i == 7)
{
I2C_SDA_H; // 释放总线
}
_ucByte <<= 1; /* 左移一个bit */
i2c_Delay();
}
}
接收一个字节并作出应答;
uint8_t I2C_ReceiveByte(u8 ack)
{
uint8_t i;
uint8_t value;
/* 读到第1个bit为数据的bit7 */
value = 0;
for (i = 0; i < 8; i++)
{
value <<= 1;
I2C_SCL_H;
i2c_Delay();
if (I2C_SDA_STATE !=0)
{
value++;
}
I2C_SCL_L;
i2c_Delay();
}
if(ack==0)
I2C_NACK();
else
I2C_ACK();
return value;
}
而在面试的时候,面试官会问你IIC协议是什么,你只要回答出IIC的通信过程以及数据传输的特征,一般都可以通过的,指出有哪些IO口,当回答不出来的时候,只要记住俩个接口,还有起始和结束信号,数据传输的特征,一般都差不多了,其他的说可以去看看数据手册
SPI协议
串口
电子模块
超声波
4988
[4988的相关接线及代码
https://blog.csdn.net/PoJiaA123/article/details/85107927?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164801604216782246445050%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=164801604216782246445050&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-5-85107927.nonecase&utm_term=4988%E6%8E%A5%E7%BA%BF&spm=1018.2226.3001.4450)
大疆电机
https://blog.csdn.net/qq_30267617/article/details/119651826
OLED
Linux基本指令
查看内存的指令
1.top
2.free命令
命令格式:free -m
参考
IIC协议参考该博客:https://blog.csdn.net/qq_40147893/article/details/106762340