面试经历(1)--二战技术面

项目经历

基本将大学期间的所有的讲出来就行,说负责的以及其技术点,说出来就差不多了

通信协议

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

https://blog.csdn.net/weixin_44206533/article/details/89300723?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164801597016780271995255%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=164801597016780271995255&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-10-89300723.nonecase&utm_term=4988%E9%A9%B1%E5%8A%A8%E6%AD%A5%E8%BF%9B%E7%94%B5%E6%9C%BA&spm=1018.2226.3001.4450

[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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值