【嵌入式工程师面试高频问题】你知道IIC吗(附程序说明)_iic面试题

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

SPI优点:支持全双工操作;操作简单;数据传输速率较高。SPI没有定义速度限制,一般的实现通常能达到甚至超过10 Mbps。

SPI缺点:需要占用主机较多的口线(每个从机都需要一根片选线);只支持单个主机;没有指定的流控制,没有应答机制确认是否接收到数据。

I2C优点:只使用两根电线,支持多个主服务器和多个从服务器,ACK / NACK位确认每个帧都已成功传输,硬件没有UART那么复杂。

I2C缺点:数据传输速率比SPI慢(IIC 最高的速度也就快速+模式(1 Mbps)和高速模式(3.4 Mbps)),数据帧的大小限制为8位,实现比SPI更复杂的硬件。

UART优点:只使用两根电线,不需要时钟信号,有一个奇偶校验位,只要双方设置后,就可以改变数据包的结构。

UART缺点:数据帧的大小限制为最多9位,不支持多个从属或多个主系统,速度最慢。

IIC八种状态和对应代码

其实IIC的通信就是通过两根线的八种状态完成的。**两根线怎么会有八种状态?**其实一根线有高电平、低电平、上升沿、下降沿四种状态。
在这里插入图片描述
数据线和时钟线组成的8种状态。
在这里插入图片描述
下面的代码就是用IO口去模拟IIC。实验是在STM32F103芯片做的,是能够跑通的。
在这里插入图片描述
在这里插入图片描述

//产生IIC起始信号 
void IIC\_Start(void)  
{  
    SDA\_OUT();     //sda输出 
    IIC_SDA=1;          
    IIC_SCL=1;  
    delay\_us(4);  
    IIC_SDA=0;//START:when CLK is high,DATA change form high to low 
   	delay\_us(4);  
    IIC_SCL=0;//铅住I2C总线,准备发送或接收数据 
}   


在这里插入图片描述

//IIC发送一个字节 
//返回从机有无应答 
//1,有应答 
//0,无应答 
void IIC\_Send\_Byte(u8 txd)  
{                          
    u8 t;     
    SDA\_OUT();        
    IIC_SCL=0;//拉低时钟开始数据传输 
    for(t=0;t<8;t++)  
    {                
       IIC_SDA=(txd&0x80)>>7;  //往SDA上放数据,放txd最高位
       txd<<=1;      
       delay\_us(2);   //对TEA5767这三个延时都是必须的 
       IIC_SCL=1;  
       delay\_us(2);   
       IIC_SCL=0;    
       delay\_us(2);  
    }      
}     

在这里插入图片描述

//等待应答信号到来 
//返回值:1,接收应答失败 
// 0,接收应答成功 
u8 IIC\_Wait\_Ack(void)  
{  
    u8 ucErrTime=0;  
   	SDA\_IN();      //SDA设置为输入 
    IIC_SDA=1;delay\_us(1);       //SDA设置为1,释放SDA总线
    IIC_SCL=1;delay\_us(1);     
    while(READ_SDA)  //读SDA,如果SDA一直为1,则无应答;如果SDA为0,则应答成功
    {  
        ucErrTime++;  
        if(ucErrTime>250)  
       	{  
            IIC\_Stop();  
            return 1;  
        }  
    }  
    IIC_SCL=0;//时钟输出0 
    return 0;    
}  

在这里插入图片描述

//产生ACK应答 
void IIC\_Ack(void)  
{  
    IIC_SCL=0;  
    SDA\_OUT();  
    IIC_SDA=0;  
   	delay\_us(2);  
    IIC_SCL=1;  
    delay\_us(2);  
    IIC_SCL=0;  
}  

在这里插入图片描述

//读数据
//返回值就是接收到的一个字节
u8 IIC\_Read\_Byte(unsigned char ack)  
{  
    unsigned char i,receive=0;  
    SDA\_IN();//SDA设置为输入 
    for(i=0;i<8;i++ )  
    {  
        IIC_SCL=0;   
        delay\_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(); //发送ACK 
     return receive;  
} 

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值