打印
[STM8]

问高手一个关于STM8 I2C的问题

[复制链接]
8829|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jgphu|  楼主 | 2010-8-11 20:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
I2c, STM8, TE, ck, hz
最近在调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.
沙发
香水城| | 2010-8-12 09:24 | 只看该作者
你参考的那个程序本身正常吗?

使用特权

评论回复
板凳
jgphu|  楼主 | 2010-8-12 09:31 | 只看该作者
没有试过,但是除了初始化搞的有点复杂外,读写语句的逻辑是对的。

使用特权

评论回复
地板
jgphu|  楼主 | 2010-8-12 09:31 | 只看该作者
那参考的那可是官方的固库示例,应该不会有问题。:call:

使用特权

评论回复
5
香水城| | 2010-8-12 09:39 | 只看该作者
你最好先确认你参考的那个程序本身可以正常工作,这至少可以确保你的硬件环境正确、你的软件环境正确,并且你的操作过程正确。

使用特权

评论回复
6
yybj| | 2010-8-12 10:36 | 只看该作者
官方的固件库示例有时也是会出问题的

使用特权

评论回复
7
jgphu|  楼主 | 2010-8-12 15:09 | 只看该作者
请问一下,STM8自带I2C设定时,I2C的GPIO要设置吗?如果要,该怎么设

使用特权

评论回复
8
jgphu|  楼主 | 2010-8-12 16:08 | 只看该作者
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;                  //为下一次接收使能应答
}

使用特权

评论回复
9
ybing| | 2010-8-20 16:04 | 只看该作者
记号备用

使用特权

评论回复
10
heiitan| | 2010-9-17 10:50 | 只看该作者
MARK

使用特权

评论回复
11
yechengyuan| | 2010-10-7 19:05 | 只看该作者
1# jgphu
我今天终于找出问题了,ST的库没有问题,例程的一个函数有问题

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

  while(!I2C_CheckEvent(I2C_EVENT_MASTER_ADDRESS_ACKED));
加上这个就好了
  I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);

使用特权

评论回复
12
jakehusonic| | 2011-12-5 16:55 | 只看该作者
正需要,谢谢

使用特权

评论回复
13
mofan1| | 2012-11-18 18:56 | 只看该作者
1# jgphu


MARK

使用特权

评论回复
14
rabbit0714| | 2012-11-24 21:03 | 只看该作者
I2C_FREQR |= 0x10;                  //输入外设时钟频率为1MHz
输入外设时钟频率应是16MHZ吧??

使用特权

评论回复
15
xhdzwzj| | 2012-12-19 11:21 | 只看该作者
mark

使用特权

评论回复
16
rainbow_hunter| | 2012-12-31 13:52 | 只看该作者
mark

使用特权

评论回复
17
hbxlasl| | 2013-6-23 16:48 | 只看该作者
记下

使用特权

评论回复
18
特大老虎| | 2013-8-3 23:08 | 只看该作者
记一下

使用特权

评论回复
19
qin854626383| | 2013-8-16 17:51 | 只看该作者
mark一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

642

帖子

2

粉丝