找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3460|回复: 4
打印 上一主题 下一主题
收起左侧

关于C语言I2C协议实现写入函数的问题

[复制链接]
跳转到指定楼层
楼主
ID:73707 发表于 2015-2-17 13:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit SDA = P2^0;
  6. sbit SCL = P2^1;

  7. void delay()
  8. {
  9.     _nop_();
  10.         _nop_();
  11.         _nop_();
  12.         _nop_();
  13.         _nop_();
  14. }

  15. void delay1ms()
  16. {
  17.    unsigned char i,j;       
  18.          for(i=0;i<10;i++)
  19.           for(j=0;j<33;j++)
  20.            ;                 
  21. }

  22. void delaynms(unsigned char n)
  23. {
  24.     unsigned char i;
  25.         for(i=0;i<n;i++)
  26.            delay1ms();
  27. }

  28. void i2c_init()
  29. {
  30.     SDA = 1;
  31.         SCL = 1;
  32. }

  33. void i2c_start()
  34. {
  35.     SDA = 1;
  36.         SCL = 1;
  37.         delay();
  38.         SDA = 0;
  39.         delay();
  40.         SCL = 0;
  41.         delay();
  42. }

  43. void i2c_stop()
  44. {
  45.     SDA = 0;
  46.         SCL = 1;
  47.         delay();
  48.         SDA = 1;
  49.         delay();
  50. }   

  51. bit wait_ack()
  52. {
  53.    bit a;
  54.    uchar i = 0;
  55.    SDA = 1;
  56.    delay();
  57.    SCL = 1;
  58.    delay();
  59.    while (SDA == 1 && i < 250) i++;
  60.    a = SDA;
  61.    SCL = 0;
  62.    delay();
  63.    return a;
  64. }

  65. void i2c_write(uchar dat)
  66. {
  67.     uchar i;
  68. /*
  69.         for(i = 0; i < 8; i++) {            
  70.                 SCL = 0;
  71.                 delay();
  72.                 dat <<= 1;
  73.                 SDA = CY;
  74.                 delay();
  75.                 SCL = 1;
  76.                 delay();
  77.         }
  78.        
  79. */         

  80.     for(i = 0; i < 8; i++) {                                        // send the data bit by bit
  81.                 SCL = 0;
  82.                 delay();
  83.                 dat <<= 1;
  84.                 SDA = CY;
  85.                 delay();                  
  86.                 SCL = 1;
  87.                 delay();
  88.                 SCL = 0;                       
  89.                 delay();
  90.         }
  91.         wait_ack();
  92. }

  93. uchar i2c_read()
  94. {
  95.     uchar i, temp = 0;
  96.         for(i = 0; i < 8; i++) {
  97.             temp <<= 1;
  98.                 SCL = 0;
  99.                 delay();
  100.                 SCL = 1;
  101.                 delay();
  102.                 temp |= SDA;
  103.         }
  104.         return temp;
  105. }

  106. void write_addr(uchar addr, uchar dat)
  107. {
  108.     i2c_start();
  109.         i2c_write(0xa0);
  110.         i2c_write(addr);
  111.         i2c_write(dat);
  112.         i2c_stop();
  113.         delaynms(4);
  114. }
  115.                        
  116. uchar read_addr(uchar addr)
  117. {
  118.     uchar temp;
  119.         i2c_start();
  120.         i2c_write(0xa0);
  121.         i2c_write(addr);
  122.         i2c_start();
  123.         i2c_write(0xa1);
  124.         temp = i2c_read();
  125.     i2c_stop();
  126.         return temp;
  127. }

  128. void main()
  129. {
  130.     i2c_init();
  131.     write_addr(0x00, 0xee);
  132.         P1 = read_addr(0x00);
  133.         while(1);
  134. }
复制代码


程序其余部分应该没有问题,其中注释部分只不过将拉低SCL电平的时机变动了一下,怎么就会写入失败了呢?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:32773 发表于 2015-2-17 21:30 | 只看该作者
学习  
回复

使用道具 举报

板凳
ID:64898 发表于 2015-3-9 10:30 | 只看该作者
#include<intrins.h> #define uchar unsigned char sbit sda = P1^7; sbit scl = P1^1; /****************************I2C总线开始*************************/ void start_24c04(void)  {         sda = 1;         _nop_();         scl = 1;         _nop_();         sda = 0;         _nop_();         scl = 0; } /****************************I2C总线停止*************************/ void stop_24c04(void)  {         sda = 0;         _nop_();         scl = 1;         _nop_();         sda = 1;         _nop_(); } /*****************************应答程序**************************/ void ack_24c04(void)   {         uchar i = 255;         scl = 1;         _nop_();         while(sda && i--);         scl = 0;         _nop_(); } /***************************I2C总线初始化************************/ void init_24c04(void) {         sda = 1;_nop_();//常态         scl = 0;_nop_();//常态 } /***************************读取一个字节*************************/ uchar read_onebyte_24c04(void)  {         uchar i,dat;         sda = 1; // 释放总线         for(i = 0;i < 8;i++)         {                 scl = 1;                 dat = dat << 1;                 if(sda)dat = dat | 0x01;                 scl = 0;         }         sda = 1;scl = 0;         return(dat); } /*****************************写入一个字节**********************/ void write_onebyte_24c04(uchar dat)  {                  uchar i;         for(i = 0;i < 8;i++)         {                 sda = (bit)(dat & 0x80);                 dat = dat << 1;                 scl = 1;                 scl = 0;         }         sda = 1;scl = 0; }  /*********************对某个地址写一个字节的数据***********************/ void write_add_dat_24c04(uchar add,uchar dat) {         start_24c04();         write_onebyte_24c04(0xa0);         ack_24c04();         write_onebyte_24c04(add);         ack_24c04();         write_onebyte_24c04(dat);         ack_24c04();         stop_24c04(); } /********************读取某个地址一个字节的数据*******************/ uchar read_add_dat_24c04(uchar add) {         uchar dat;         start_24c04();         write_onebyte_24c04(0xa0);         ack_24c04();         write_onebyte_24c04(add);         ack_24c04();         start_24c04();         write_onebyte_24c04(0xa1);         ack_24c04();         dat = read_onebyte_24c04();         stop_24c04();         return(dat); }
回复

使用道具 举报

地板
ID:64898 发表于 2015-3-9 10:30 | 只看该作者

#include<intrins.h>
#define uchar unsigned char
sbit sda = P1^7;
sbit scl = P1^1;
/****************************I2C总线开始*************************/
void start_24c04(void)
{
        sda = 1;
        _nop_();
        scl = 1;
        _nop_();
        sda = 0;
        _nop_();
        scl = 0;
}
/****************************I2C总线停止*************************/
void stop_24c04(void)
{
        sda = 0;
        _nop_();
        scl = 1;
        _nop_();
        sda = 1;
        _nop_();
}
/*****************************应答程序**************************/
void ack_24c04(void)  
{
        uchar i = 255;
        scl = 1;
        _nop_();
        while(sda && i--);
        scl = 0;
        _nop_();
}
/***************************I2C总线初始化************************/
void init_24c04(void)
{
        sda = 1;_nop_();//常态
        scl = 0;_nop_();//常态
}
/***************************读取一个字节*************************/
uchar read_onebyte_24c04(void)
{
        uchar i,dat;
        sda = 1; // 释放总线
        for(i = 0;i < 8;i++)
        {
                scl = 1;
                dat = dat << 1;
                if(sda)dat = dat | 0x01;
                scl = 0;
        }
        sda = 1;scl = 0;
        return(dat);
}
/*****************************写入一个字节**********************/
void write_onebyte_24c04(uchar dat)
{
       
        uchar i;
        for(i = 0;i < 8;i++)
        {
                sda = (bit)(dat & 0x80);
                dat = dat << 1;
                scl = 1;
                scl = 0;
        }
        sda = 1;scl = 0;
}

/*********************对某个地址写一个字节的数据***********************/
void write_add_dat_24c04(uchar add,uchar dat)
{
        start_24c04();
        write_onebyte_24c04(0xa0);
        ack_24c04();
        write_onebyte_24c04(add);
        ack_24c04();
        write_onebyte_24c04(dat);
        ack_24c04();
        stop_24c04();
}
/********************读取某个地址一个字节的数据*******************/
uchar read_add_dat_24c04(uchar add)
{
        uchar dat;
        start_24c04();
        write_onebyte_24c04(0xa0);
        ack_24c04();
        write_onebyte_24c04(add);
        ack_24c04();
        start_24c04();
        write_onebyte_24c04(0xa1);
        ack_24c04();
        dat = read_onebyte_24c04();
        stop_24c04();
        return(dat);
}

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:64898 发表于 2015-3-9 10:31 | 只看该作者
goahead! 发表于 2015-3-9 10:30
#include
#define uchar unsigned char
sbit sda = P1^7;

这个没什么问题
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表