12975|14

83

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

问高手一个关于STM8 I2C的问题 [复制链接]

最近在调STM8 的I2C(不想搞模拟的I2C),结果I2C没有调通,不知道问题所在,软件是参考I2C EEPROM固件那个程序写的。初始化如下:

void IIC_Init(void)
{
UCHAR temp;

CLK_PCKENR1 |= 0x01;
I2C_CR1    = 0x00;                  //禁止I2C外设
I2C_FREQR  = 0x04;                  //输入外设时钟频率为1MHz
I2C_CCRH   = 0x00;
I2C_CCRL   = 0x05;                  //SCK时钟为100kHz
I2C_CR1    = 0x01;                  //开启I2C外设
I2C_CR2   |= 0x04;                  //当前接收字节返回应答
I2C_OARL   = 0x86;                  //自身地址
I2C_OARH   = 0x40;
I2C_SR2 = 0;
temp = I2C_SR1;
temp = I2C_SR3;
}

请高手帮帮忙;

1,这个初始化我是按照SPEC主模式的步骤写的,其中的输出频率不知道是不是100K
2,STVP的OPTION也配置为I2C.
此帖出自stm32/stm8论坛

最新回复

我再调试过程中,I2c的busy位一直置位,可以参考我写的帖子:http://www.eemaker.com/stm8s-i2c-busy.html  详情 回复 发表于 2016-11-28 14:08
点赞 关注(1)
 

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
                                 你参考的那个程序本身正常吗?
此帖出自stm32/stm8论坛
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
                                 没有试过,但是除了初始化搞的有点复杂外,读写语句的逻辑是对的。
此帖出自stm32/stm8论坛
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

4
 
                                 那参考的那可是官方的固库示例,应该不会有问题。
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 
                                 你最好先确认你参考的那个程序本身可以正常工作,这至少可以确保你的硬件环境正确、你的软件环境正确,并且你的操作过程正确。
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 
                                 官方的固件库示例有时也是会出问题的
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 
                                 请问一下,STM8自带I2C设定时,I2C的GPIO要设置吗?如果要,该怎么设
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

8
 
stm8 自带I2C终于调试成功。

1,此次调试I2C受益多多,首先证明官方的那个写EEPROM的程序是对的。
2,这次调试TW8816开始调不通的原因是误以为寄存器地址是16位的(芯片公司的业务也是这么说的,我相信了),才让我看到的数据不同,但我想,有数据了,而且用WHILE等待的方法,程序跑通了,说明连上了从机。
3, I2C的GPIO不要配置,我看到有些同仁把GPIO配置了。
4,为了大家用好STM8的I2C,我把程序烤下来。

void IIC_Init(void)
{
        UCHAR temp;
       
        CLK_PCKENR1 |= 0x01;

        I2C_FREQR |= 0x10;                  //输入外设时钟频率为1MHz
        I2C_CR1    = 0x00;                  //禁止I2C外设
        I2C_CCRH  &= ~0xcf;
        I2C_CCRL  &= ~0xff;  
  I2C_TRISER = 0x11;
        I2C_CCRL   = 0x10;
        I2C_CCRH   = 0x00;
        I2C_CR1   |= 0x01;                  //开启I2C外设
        I2C_CR2   |= 0x04;                  //当前接收字节返回应答
        I2C_CR2   &= 0x08;
        I2C_OARL   = 0x86;                  //自身地址
        I2C_OARH   = 0x40;
}

void Read_8816(UCHAR *pBuffer, UCHAR index, UCHAR NumByteToRead)
{
        UCHAR temp;

        while(I2C_SR3 & 0x02);             //等待总线空闲
        I2C_CR2 |= 0x01;                                //产生起始位
        while(!(I2C_SR1 & 0x01));          //等待START发送完
        I2C_DR = 0x8a;                     //发送8816器件地址
        while(!(I2C_SR1 & 0x02));          //等特7位器件地址发送完
        temp = I2C_SR1;
        temp = I2C_SR3;
        I2C_DR = (UCHAR)(index);
        while(!(I2C_SR1 & 0x84));
       
        I2C_CR2 |= 0x01;                                      //产生重复起始位
        while(!(I2C_SR1 & 0x01));          //等待START发送完
        I2C_DR = 0x8b;                     //读
        while(!(I2C_SR1 & 0x02));          //等特7位器件地址发送完
        temp = I2C_SR1;
        temp = I2C_SR3;
        while(NumByteToRead)                      //要读几个字节
        {
                if(NumByteToRead == 1)
                {
                        I2C_CR2 &= ~0x04;              //不返回应答
                        I2C_CR2 |= 0x02;               //产生停止位
                }
                if(I2C_SR1 & 0x40)
                {
                        temp = I2C_SR1;
                        Buff[8-NumByteToRead]=I2C_DR;
                        *pBuffer = Buff[8-NumByteToRead];
                        pBuffer++;
                        NumByteToRead--;
                }
        }
        I2C_CR2 |= 0x04;
        I2C_CR2 &= ~0x08;                  //为下一次接收使能应答
}
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

9
 
                                 记号备用
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

10
 
                                 MARK
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

11
 

我今天终于找出问题了,ST的库没有问题,例程的一个函数有问题

void I2C_EE_ByteWrite(u8 WriteData, u16 WriteAddr)
在写完器件地址后就会死机,在

  while(!I2C_CheckEvent(I2C_EVENT_MASTER_ADDRESS_ACKED));
加上这个就好了
  I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);
此帖出自stm32/stm8论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

12
 
repeater 发表于 2010-8-12 16:08
stm8 自带I2C终于调试成功。

1,此次调试I2C受益多多,首先证明官方的那个写EEPROM的程序是对的。
...

楼主,你这样的while等待,万一等不过去,程序岂不是卡死?
此帖出自stm32/stm8论坛
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

13
 
IIC我一直都是模拟 感觉官方库不是很稳定 不太好用
此帖出自stm32/stm8论坛
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

14
 
我用官方的,感觉读出的数据有问题,现在在模拟,还没出来。
此帖出自stm32/stm8论坛
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

15
 
我再调试过程中,I2c的busy位一直置位,可以参考我写的帖子:http://www.eemaker.com/stm8s-i2c-busy.html
此帖出自stm32/stm8论坛
 
个人签名电子创客营:www.eemaker.com
关注微信号公众号:eemaker
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表