STM8单片机硬件IIC通信调试总结(需要调用的库函数、个人的理解错误)

一、需要调用的库函数(本篇文章只讲主机作为发送器) 

1.准备工作(读懂序列图)

2.需要调用的库函数,实现从主机向从机发送数据(省略了上图中标志位的检测,但本人亲测能实现IIC通信)

CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);//设置系统时钟为1分频,即不分频

CLK_PeripheralClockConfig(CLK_Peripheral_I2C1, ENABLE);//使能IIC的时钟

I2C_Init(I2C1, 100000, 0,
           I2C_Mode_I2C, I2C_DutyCycle_2,
           I2C_Ack_Enable, I2C_AcknowledgedAddress_7bit);//IIC的初始化

I2C_Cmd(ENABLE);//使能IIC

I2C_GenerateSTART(I2C1, ENABLE);//IIC的起始信号

I2C_Send7bitAddress(I2C1, (uint8_t)SLAVE_ADDRESS, I2C_Direction_Transmitter);//7位从机地址+1位方向

I2C_SendData(I2C1, REGISTER_ADDRESS);//发送寄存器地址

I2C_SendData(I2C1, DATA);//向寄存器发数据

I2C_GenerateSTOP(I2C1, ENABLE);//IIC的停止信号

二、个人所犯的理解错误

1.对于IIC协议理解的错误

   错误理解:我认为只要主机发送了起始信号,时钟线就会有脉冲

   正确理解:时钟线和数据线同步存在,数据线在发送数据的时候,时钟线才会有脉冲

2.还是下面那张序列图,对寄存器写入数据理解错误

错误理解:因为上图数据是连续发送的,我认为当对从机的两个寄存器写入数据的时候,可以在一次开始信号和一次结束信号内完成,但实际上这样是不可以的,即流程为:起始信号——写入第一个寄存器地址和数据——写入第二个寄存器地址和数据——停止信号。

错误的原因:上述写法会导致单片机把第二个寄存器的地址和数据都看为数据,并且第一个寄存器后面的地址。

正确理解:我们对两个寄存器写入数据,要分两次发送,即流程为:第一次起始信号——写入第一个寄存器地址和数据——第一次停止信号,第二次起始信号——写入第二个寄存器地址和数据——第二次停止信号。

    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值