STM32,IIC总线。

IIC总线这块很难,确实研究了一段时间。基础知识、教程等就不写了,反正也是给自己看。其他都在手册里。

总体上看需要几部分:

1、选取端口设置成IIC总线,GPIO输出。并拉高。  预定义I2C_SCL    I2C_SDA      I2C_SDA_H    I2C_SDA_L  I2C_SCL_H  I2C_SCL_L等。

2、编写函数,SDA输入输出,主要是配置GPIO模式。

3、根据IIC基础知识——时序图,

注意:1、在总线空闲的时候, SDA 和 SCL 都是高电平的。
2、在 SCL 为高电平期间, SDA 必须保持稳定。所以 SDA 改变状态最好在 SCL 为低电
平的时候改变,如果在高电平改变的话回被认为是一种有效信号(如:起始信号或者结束信
号) 。

编写:起始信号,终止信号,主机产生应答,主机不产生应答,等待从机应答(返回值:成功或失败)。

       根据上述几个函数,再根据时序图编写,IIC上发送一个字节,读取一个字节。

4、弄清AT24C01/02/04/08/16/32/64/128等器件手册,多看几遍。主要看时序图。

5、编写通用程序。读AT24Cxx字节,写AT24Cxx字节。

主要看程序解释。  这里注意C16以上数据地址为u16,器件地址为a0。C16以下数据地址为u8.器件地址为a0+A2A1A0.

16以上,addr为纯数据地址。16以下,addr为器件地址加数据地址

/*******************************************************************************
* 函 数 名         : AT24Cxx_WriteOneByte
* 函数功能   : 24c02写一个字节地址  数据   
* 输    入         : addr  dt
* 输    出         : 无
*******************************************************************************/
void AT24Cxx_WriteOneByte(u16 addr,u8 dt)
{
I2C_Start();


if(EE_TYPE>AT24C16)
{
I2C_Send_Byte(0xA0); //器件地址
I2C_Wait_Ack();
I2C_Send_Byte(addr>>8); //发送数据地址高位
}
else
{
  I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址
}


I2C_Wait_Ack();
I2C_Send_Byte(addr%256);// 数据地址 16以上是数据地址低位
// 16以下是数据地址
I2C_Wait_Ack();


I2C_Send_Byte(dt);
I2C_Wait_Ack();
I2C_Stop();


delay_ms(10);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在STM32中,防止I2C总线锁死有几种方法。 首先,确保总线配置正确。首先,设置I2C的时钟频率,需要根据所连接的外设和总线负载来选择合适的频率。过高的频率可能导致通信错误,而过低的频率可能导致通信速度过慢。其次,确保总线上没有冲突的地址。每个I2C设备应该有一个独一无二的地址,确保没有地址冲突可以避免通信的错误。 其次,使用适当的超时机制。在进行I2C通信时,可以设置一个超时时间,如果超过这个时间还没有接收到回应信号,就可以中断通信,重新初始化总线,避免总线锁死。超时时间需要根据具体应用场景和通信速率来调整。 另外,保持总线始终处于正确的状态。在进行I2C通信过程中,需要根据具体情况来确认并处理可能出现的错误,如丢失ACK信号、总线冲突等。可以通过编写适当的错误处理代码,在出现错误时及时处理,避免导致总线锁死。 最后,合理设计系统中的并发操作。如果系统中存在多个任务同时使用I2C总线进行通信,需要合理设计任务的优先级和调度机制,避免出现同时访问总线的情况,从而避免总线锁死。可以使用信号量或互斥锁机制来进行任务的同步和互斥访问。 通过以上的方法,可以有效地防止STM32中的I2C总线锁死问题,保证系统的稳定性和可靠性。 ### 回答2: STM32IIC总线锁死是指在使用IIC通信时出现的一种现象,即当IIC总线的通信协议发生异常或通信线路出现问题时,导致IIC总线无法正常通信。 防止STM32IIC总线锁死,可以采取以下措施: 1. 总线复位:当发现IIC总线出现异常时,可以通过对总线进行复位来恢复通信。具体方法是通过对IIC控制器进行硬件复位或对总线引脚进行切换操作,使IIC总线重新初始化。 2. 超时机制:可以在IIC通信过程中设置超时机制,即设定一个最大的等待时间。如果在超过该时间后对方没有发送应答信号,就认为出现了异常,重新初始化IIC总线。 3. 错误处理:可以通过判断IIC通信过程中返回的错误标志位来处理异常情况。当发现错误标志位被置位时,可以进行相应的错误处理,例如重新初始化IIC总线。 4. 异常处理:当IIC总线出现锁死时,可以通过加入异常处理函数来进行处理。异常处理函数可以在IIC总线出现异常时进行复位操作,重新初始化IIC总线,并进行相应的错误处理。 5. 电源滤波和信号线布局:对于IIC总线来说,电源质量和信号线的布局都会影响通信的稳定性。因此,在设计电路板时应注重电源滤波和信号线的布局,以减小可能出现的通信故障。 综上所述,通过合理设置超时机制、错误处理、异常处理等方法,以及在硬件设计中注意电源滤波和信号线布局,可以有效地防止STM32IIC总线锁死。 ### 回答3: 在STM32中,为了防止IIC总线锁死,我们可以采取以下措施: 1. 确保电源正常供应:IIC总线的正常工作需要稳定的电源供应。因此,我们需要确保电源电压在规定的范围内,并且电源稳定性良好,以避免造成IIC总线锁死。 2. 适当设置IIC总线时钟速度:IIC总线的通信速度需要根据实际应用需求进行适当设置。如果时钟速度过高,可能会导致总线锁死。因此,我们需要根据实际情况选取合适的时钟速度,避免过高或过低的速度。 3. 优化软件程序:在软件程序的设计和编写中,需要遵循一些原则来防止IIC总线锁死。例如,使用适当的延时函数,以确保总线上的数据能够正确传输和处理。此外,还需要处理错误状态和异常情况,及时采取相应的措施,避免总线锁死。 4. 使用适当的阻尼电路:在实际应用中,我们可以通过添加适当的阻尼电路来消除IIC总线上的反射和干扰。这样可以提高总线的稳定性,降低总线锁死的风险。 综上所述,为了防止STM32中的IIC总线锁死,我们需要确保电源供应正常,设置合适的时钟速度,优化软件程序,以及使用适当的阻尼电路等措施。通过这些方法可以提高总线的稳定性,从而减少IIC总线锁死的发生。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值