找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3460|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

關(guān)于C語言I2C協(xié)議實(shí)現(xiàn)寫入函數(shù)的問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:73707 發(fā)表于 2015-2-17 13:53 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  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. }
復(fù)制代碼


程序其余部分應(yīng)該沒有問題,其中注釋部分只不過將拉低SCL電平的時(shí)機(jī)變動(dòng)了一下,怎么就會(huì)寫入失敗了呢?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:32773 發(fā)表于 2015-2-17 21:30 | 只看該作者
學(xué)習(xí)  
回復(fù)

使用道具 舉報(bào)

板凳
ID:64898 發(fā)表于 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_(); } /*****************************應(yīng)答程序**************************/ void ack_24c04(void)   {         uchar i = 255;         scl = 1;         _nop_();         while(sda && i--);         scl = 0;         _nop_(); } /***************************I2C總線初始化************************/ void init_24c04(void) {         sda = 1;_nop_();//常態(tài)         scl = 0;_nop_();//常態(tài) } /***************************讀取一個(gè)字節(jié)*************************/ 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); } /*****************************寫入一個(gè)字節(jié)**********************/ 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; }  /*********************對(duì)某個(gè)地址寫一個(gè)字節(jié)的數(shù)據(jù)***********************/ 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(); } /********************讀取某個(gè)地址一個(gè)字節(jié)的數(shù)據(jù)*******************/ 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); }
回復(fù)

使用道具 舉報(bào)

地板
ID:64898 發(fā)表于 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_();
}
/*****************************應(yīng)答程序**************************/
void ack_24c04(void)  
{
        uchar i = 255;
        scl = 1;
        _nop_();
        while(sda && i--);
        scl = 0;
        _nop_();
}
/***************************I2C總線初始化************************/
void init_24c04(void)
{
        sda = 1;_nop_();//常態(tài)
        scl = 0;_nop_();//常態(tài)
}
/***************************讀取一個(gè)字節(jié)*************************/
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);
}
/*****************************寫入一個(gè)字節(jié)**********************/
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;
}

/*********************對(duì)某個(gè)地址寫一個(gè)字節(jié)的數(shù)據(jù)***********************/
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();
}
/********************讀取某個(gè)地址一個(gè)字節(jié)的數(shù)據(jù)*******************/
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);
}

評(píng)分

參與人數(shù) 1黑幣 +35 收起 理由
admin + 35 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

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

這個(gè)沒什么問題
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表