打印
[STM8]

请问硬件I2C如何设计的?我总是调不通啊

[复制链接]
4199|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stm8s|  楼主 | 2010-10-18 17:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问硬件I2C如何设计的?我总是调不通啊
沙发
jgphu| | 2010-10-18 17:29 | 只看该作者

使用特权

评论回复
板凳
jgphu| | 2010-10-18 17:29 | 只看该作者
地板
jgphu| | 2010-10-18 17:30 | 只看该作者
jgphu发表于 2010-10-18 14:57 | 只看该作者 回复 引用 编辑 评分 返回版面 TOP  得分:0
6楼: 还有下面的
#include "iic.h"

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;
                        *pBuffer = I2C_DR;
                        pBuffer++;
                        NumByteToRead--;
                }
        }
        I2C_CR2 |= 0x04;
        I2C_CR2 &= ~0x08;                  //为下一次接收使能应答
}

使用特权

评论回复
5
stm8s|  楼主 | 2010-10-18 17:41 | 只看该作者
哦,我真粗心,I2C的协议。。地址搞错了,谢谢你。

使用特权

评论回复
6
jgphu| | 2010-10-18 17:42 | 只看该作者
呵呵,以后细心点

使用特权

评论回复
7
hsbjb| | 2010-10-18 19:26 | 只看该作者
楼主调多了,就会逐渐有经验了

使用特权

评论回复
8
lzymcu| | 2010-11-22 17:12 | 只看该作者
有没有人库来做的呢,我弄了几天,就是不进中断,气死人!

使用特权

评论回复
9
xyz160405| | 2010-11-24 12:58 | 只看该作者
我没有用中断,不过是用库的,读写24c02的
可以联系我
xyz160405@163.com
8# lzymcu

使用特权

评论回复
10
CoolBird007| | 2010-11-25 11:21 | 只看该作者
我没有用库,直接操件寄存器的,读写24C02,调了一天才调好。。

使用特权

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

本版积分规则

0

主题

7

帖子

1

粉丝