首页 > 编程知识 正文

嵌入式开发工程师面试题,嵌入式开发面试问题

时间:2023-05-05 13:56:09 阅读:158265 作者:4570

在嵌入式面试中,熟悉IIC的工作原理使用场景,将IIC的3358www.Sina.com/和IIC3358www.Sina.com/

IIC的3358www.Sina.com/在《沧小海详解面试的必答题——I2C协议》的博客中有介绍,这里主要补充IIC的3358www.Sina.com/顺便补充一下IIC、SPI和UART的区别。

IIC读写特征IIC的最大特点是只使用两条线进行通信,支持多台主服务器和多台从服务器。

IIC只有两条线。 另外,没有像SPI那样的单侧线。 你怎么区分地址? 其实IIC总线每个设备都有自己的地址,有些芯片是固定的。 自己用GPIO模拟就可以自己决定地址。

IIC、SPI、UART区分SPI:4线、全双工同步、速度最腼腆的自行车10Mbps

I2C :两条线,半双工同步,速度一般为1Mbps、

UART:2条线,全双工异步,速度一般不超过20Kbps

UART与SPI、I2C的最大区别在于,后两者为时序图,需要统一的时钟线,而UART不需要,布线方便,但收发两者都需要配置相同的波特率即,设备需要自己的时钟源;

因为I2C协议有地址规则,所以在读写程序通信的情况下更有利。 常用于连接传感器

SPI编程简单,可应用于设备少、端口充足、对通信速度要求不高的场合,常用于连接EEPROM、闪存或液晶显示屏。

支持http://www.Sina.com/: http://www.Sina.com /操作; 操作简单; 数据传输速度很高。 SPI没有定义速度限制,典型实现通常为10 Mbps或更高。

工作原理、时序图:需要占用主机较多的口线(每个从站需要一条单脚线); 仅支持一台主机; 没有指定的流控制,并且没有确认是否已接收到数据的响应机制。

33558www.Sina.com/:2:仅使用两条电线支持多台主服务器和多台从服务器。 ACK/NACK位确保每个帧都成功传输,并且硬件没有UART那么复杂。

代码部分:传输数据的速度慢于SPI,IIC的最大速度为高速模式(1 Mbps )和高速模式(3.4 Mbps ) ),其限制数据帧的大小为8比特,并且比SPI更复杂的硬件

33558www.Sina.com/:2:只需使用两条电线,不需要时钟信号。 有奇偶校验位,如果双方都设定,就可以改变数据包的结构。

同步:数据帧大小限制为最多9位,不支持多个从系统或多个主系统,速度最快。

IIC的8种状态和对应的代码实际上IIC的通信在2条线的8种状态下进行。 *两条线为什么有8种状态? *实际上,一条线有高电平、低电平、上升沿、下降沿4种状态。

由数据线和时钟线构成的8种状态。

下面的代码是在IO端口上模拟IIC。 实验在STM32F103芯片上进行,能跑。

//IIC开始信号voidIIC_start(void ) { SDA_OUT ); //sda输出IIC_SDA=1; IIC_SCL=1; dlay_us(4); IIC_SDA=0; //START:when CLK is high,datachangeformhightolowdelay _ us (4; IIC_SCL=0; 住在//I2C总线上,准备发送接收数据}

//IIC返回1字节//从站有无响应//1,返回有响应//0、无响应的voidIIC_send_byte(u8txd ) u8t; SDA_OUT (; IIC_SCL=0; //降低时钟以开始数据传输for (t=0; t8; t ) IIC_sda=(txd0x80 ) 7;//将数据放在sda中,放置txd最高txd=1的dlay_us(2); TEA5767的三个延迟要求的IIC_SCL=1; dlay_us(2); IIC_SCL=0; dlay_us(2); }

//等待响应信号到来//返回值: 1,接收响应失败//0,接收响应成功u8IIC_wait_ack(void ) { u8 ucErrTime=0; SDA_IN (; //SDA设定为输入IIC_SDA=1; dlay_us(1);//将SDA设置为1,释放SDA总线IIC_SCL=1; dlay_us(1); 读取while(read_SDA )//sda,如果sda一直为1,则无响应; SDA为0时,响应成功{ ucErrTime; ucerrtime 250 (IIC _ stop ); 返回1; } } IIC_SCL=0; //时钟输出0 return 0; }

生成//ack响应的voidIIC_ack(void ) ) { IIC_SCL=0; SDA_OUT (; IIC_SDA=0; dlay_us(2); IIC_SCL=1; dlay_us(2); IIC_SCL=0; }

//读取数据//返回值是接收到的1字节u8iic _ read _ byte (unsignedcharack ) { unsigned char i,receive=0; SDA_IN (; //SDA被设置为输入for (I=0; i8; I ) { IIC_SCL=0; dlay_us(2); IIC_SCL=1; //SCL为高时读取数据receive=1; //每次读取时,receive向左移动一个if(read_sda ) receive; //读取SDA是receive最低位的Delay_us(1; (if (! ack(IIC_nack ); 发送nACK else IIC_Ack (; 发送确认回复; }

//IIC停止信号voidIIC_stop(void ) ) { SDA_OUT; //sda输出IIC_SCL=0; IIC_SDA=0; //stop : whenclkishighdatachangeformlowtohighdelay _ us (4; IIC_SCL=1; IIC_SDA=1; //I2c总线结束信号delay_us(4 (发送4 ); }参考资料

[1] https://blog.csdn.net/z123 canghai/article/details/83244185

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。