音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

24C01讀寫,急問!謝謝大家?guī)兔Γ。ǜ匠绦颍?/h1>

作者:xbalben 欄目:技術(shù)交流
24C01讀寫,急問!謝謝大家?guī)兔Γ。ǜ匠绦颍?br>我用的是東芝的一塊芯片模擬i2c,碰到幾個問題,主要是收不到ack信號,請大家?guī)兔Γ旅媸浅绦颍?br>
#define NOP  __asm("and A,A")
由于我用的單片機里好像沒有_nop_();這個指令,所以用上面這個代替,不知道可以不??
我用的是4M的晶振,一個機器周期是4/fc,也就是1us。

void i2c_wait(void)
{

    NOP;NOP;NOP;NOP;NOP;
}

void i2c_start(void)   //發(fā)送開始信號
{
       SDA = 1;   
       NOP;  
       SCL = 1;
       i2c_wait();
       SDA = 0;
       i2c_wait();
       SCL = 0;
       NOP;
       return;
}

void i2c_stop(void)   //發(fā)送結(jié)束信號
{
       SDA = 0;
             NOP;   
             SCL = 1;
       i2c_wait();
       SDA = 1;
       i2c_wait();
       return;
}     


CHAR i2c_ack(void)     //發(fā)送接收確認信號  ack=0 有應答
{
       CHAR ack;
       SDA = 1;
       NOP;NOP;
       SCL = 1;
       NOP;NOP;
       if  (SDA==1)
       ack = 1;
       else
       ack = 0;
       SCL = 0;
       NOP;
       return  (ack);
}


void i2c_send8bit(unsigned CHAR b)  //送八位數(shù)據(jù)
{
  unsigned  CHAR a;
  for(a=0;a<8;a++)
        {
        if(b & 0x80)
            SDA = 1;
            else
            SDA = 0;
          b = b<<1;         //時鐘保持低可以發(fā)送數(shù)據(jù)
          SCL = 1;
          i2c_wait();
          SCL = 0;
           
        }
         return;
    }

unsigned CHAR i2c_receive8bit(void)   //接收八位數(shù)據(jù)
{
       unsigned  CHAR a;
       unsigned CHAR b=0;
       for(a=0;a<8;a++)
              {
              SCL = 1;
              NOP;NOP;    
              b = b<<1;
              if (SDA==1)
              b = b|0x01;
                 
              SCL = 0;
              NOP;NOP;    
              
              }
       return  (b);
}    

void i2c_write(unsigned CHAR Address,unsigned CHAR temp1)    //i2c_write(地址,數(shù)據(jù)),寫一個字節(jié)
{
        
         
       do{
       i2c_start();
       i2c_send8bit(0xA0);
         }
       while(i2c_ack());
       i2c_send8bit(Address);
       i2c_ack();
       i2c_send8bit(temp1);
       i2c_ack();
       i2c_stop();
       delay10ms();
       return;
}

unsigned CHAR i2c_read(unsigned CHAR Address)    //i2c_read(地址,數(shù)據(jù)),寫一個字節(jié)
{
        
       
       do{
       i2c_start();
       i2c_send8bit(0xA0);
       }
       while(i2c_ack());                //=1,表示無確認,再次發(fā)送
       i2c_send8bit(Address);
       i2c_ack();


       do{
       i2c_start();
       i2c_send8bit(0xA1);
       }
       while(i2c_ack());
       temp1 = i2c_receive8bit();
        
       i2c_stop();
       return(temp1);
}

請問需要修改什么地方呢?現(xiàn)在的問題主要是收不到應答信號!

2樓: >>參與討論
天藍

/************************************************

可以參照一下這個程序,結(jié)構(gòu)和你的大體相同,在AVR單片機上調(diào)試通過了的

用的是AT24C01 EEPROM芯片

************************************************/

# include <iom8v.h>
# include <macros.h>

# define ADRS 0x01
# define N  500
# define SLAW  0b10100000
# define SLAR  0b10100001

# define SET_SDA (PORTC|=BIT(PC0))
# define CLR_SDA (PORTC&=~BIT(PC0))

# define SET_SCL (PORTC|=BIT(PC1))
# define CLR_SCL (PORTC&=~BIT(PC1))

# define SDA_PIN (PINC&BIT(PC0))

# define I2_C_DELAY (Delay_nUS(N))

/************延時函數(shù)聲明區(qū)********/
void Delay_nUS(unsigned int n);
void Delay_MS(void);
void Delay_nMS(unsigned int n);

void Send_L(void);
void Send_H(void);

unsigned CHAR Get_H(void);

void Start(void);
void Stop(void);

unsigned CHAR ACK(void);
void NO_ACK(void);

void Send_Data_by_8Bit(unsigned CHAR ch_Data);
unsigned CHAR Get_Data_by_8Bit(void);

void Write_Char(unsigned CHAR ch_Address, unsigned CHAR ch_Data);
unsigned CHAR Read_Char(unsigned CHAR ch_Address);

void PORT_INIT(void);

void main(void)
{
 PORT_INIT();
 
 while(1)
 {
  Write_Char(0x01, 0xaa);
  PORTD=Read_Char(0x01);
 }
}

void PORT_INIT(void)
{
 DDRC|=BIT(PC0)| BIT(PC1);
 PORTC|=BIT(PC0)| BIT(PC1);
 
 DDRC|=BIT(PC2);
 PORTC|=BIT(PC2);
 
 DDRD=0xff;
 PORTD=0xff;
}

void Send_L(void)
{
 CLR_SCL;
 I2_C_DELAY;
 CLR_SDA;
 I2_C_DELAY;
 SET_SCL;
 I2_C_DELAY;
 CLR_SCL;
 I2_C_DELAY;
 ////////////////0////////////////
}

void Send_H(void)
{
 CLR_SCL;
 I2_C_DELAY;
 SET_SDA;
 I2_C_DELAY;
 SET_SCL;
 I2_C_DELAY;
 CLR_SCL;
 I2_C_DELAY;
 ////////////////1////////////////
}

void Start(void)
{
 CLR_SCL;
 I2_C_DELAY;
 SET_SDA;
 I2_C_DELAY;
 SET_SCL;
 I2_C_DELAY;
 CLR_SDA;
 I2_C_DELAY;
 CLR_SCL;
 I2_C_DELAY;
 ///////////////開始//////////////
}

void Stop(void)
{
 CLR_SCL;
 I2_C_DELAY;
 CLR_SDA;
 I2_C_DELAY;
 SET_SCL;
 I2_C_DELAY;
 SET_SDA;
 I2_C_DELAY;
 CLR_SCL;
 I2_C_DELAY;
 ///////////////結(jié)束//////////////
}

unsigned CHAR ACK(void)
{
 unsigned CHAR ch_ACK=0;
 CLR_SCL;
 I2_C_DELAY;
         //SDA置為輸入后,其電平確實由24C01控制,而不是
 DDRC&=~BIT(PC0);    //受端口設置影響說明有應答信號產(chǎn)生   
 I2_C_DELAY;
  
 SET_SCL;
 I2_C_DELAY;
 if(SDA_PIN)      //NO_ACK         
  ch_ACK=1;
 else
  ch_ACK=0;
   
 CLR_SCL;
 I2_C_DELAY;
 DDRC|=BIT(PC0);
 I2_C_DELAY;
 return ch_ACK;
 ///////////////ACK///////////////
}

void NO_ACK(void)
{
 CLR_SCL;
 I2_C_DELAY;
 SET_SDA;
 I2_C_DELAY;     
 CLR_SCL;
 I2_C_DELAY;
}

unsigned CHAR Get_H(void)
{
 unsigned CHAR ch_Bit=0;
 CLR_SCL;
 I2_C_DELAY;
 
 DDRC&=~BIT(PC0);
 I2_C_DELAY;
 
 SET_SCL;
 I2_C_DELAY;
 if(SDA_PIN)
  ch_Bit=1;
 else
  ch_Bit=0;
 CLR_SCL;
 I2_C_DELAY;
 
 DDRC|=BIT(PC0);
 I2_C_DELAY;
 
 return ch_Bit;
}

void Send_Data_by_8Bit(unsigned CHAR ch_Data)
{
 unsigned CHAR Bit_Counter=0;
 for(Bit_Counter=0; Bit_Counter<8; Bit_Counter++)
 {
  if(ch_Data&BIT(7))
   Send_H();
  else
   Send_L();
  ch_Data<<=1;
 }
 ACK();
}

unsigned CHAR Get_Data_by_8Bit(void)
{
 unsigned CHAR ch_Data=0;
 unsigned CHAR Bit_Counter=0;
 for(Bit_Counter=0; Bit_Counter<8; Bit_Counter++)
 {
  ch_Data<<=1;
  if(Get_H())
  {
   ch_Data|=BIT(0);
  }
 }
 NO_ACK();
 return ch_Data;
}

void Write_Char(unsigned CHAR ch_Address, unsigned CHAR ch_Data)
{
 Start();
 Send_Data_by_8Bit(SLAW);
 Send_Data_by_8Bit(ch_Address);
 Send_Data_by_8Bit(ch_Data);
 Stop();
}

unsigned CHAR Read_Char(unsigned CHAR ch_Address)
{
 unsigned CHAR ch_Data=0;
 Start();
 Send_Data_by_8Bit(SLAW);
 Send_Data_by_8Bit(ch_Address);
 Stop();
 
 Start();
 Send_Data_by_8Bit(SLAR);
 ch_Data=Get_Data_by_8Bit();
 Stop();
 
 return ch_Data;
}
/*******************************************************************************
      延時函數(shù)(_US_ MS_ S_)         
*******************************************************************************/
void Delay_nUS(unsigned int n)
{
 unsigned int i=0;
 for(i=0; i<n; i++)
 {
  asm("nop");
 }
}

void Delay_MS(void)
{
 unsigned int i=0;
 for(i=0; i<1020; i++)
 {
  asm("nop");
 }
}

void Delay_nMS(unsigned int n)
{
 unsigned int i=0;
 for(i=0; i<n; i++)
 {
  Delay_MS();
 }
}

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
數(shù)碼管有沒有比較薄的,現(xiàn)在市場上的都是比較厚的!
運方問題?
求助,I01
單片機為何不能連續(xù)讀取參數(shù)
想把光驅(qū)改成一個CD轉(zhuǎn)盤,不明白其數(shù)字輸出口
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號