⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.c

📁 msp430液晶显示
💻 C
字号:
//ChangShu Micro-Electronics Technologies Co., Ltd.(CSMET)
//I2C Communication Route
//Copyright 2004,Ver 1.0
//Last Update:2005-5-7
#include "chip.h"
#include "i2c.h"
#include "sport0.h"
unsigned char I2CINT;
void I2CDelay(unsigned char dly)
{
 while(dly) { dly--;}
}

void StartSig(void) //I2C initiation signal
{
  I2C_OUT; //SDA,SCK out direction
  SDA_HIGH;
  I2CDelay(I2CDLY); 
  SCK_HIGH;
  I2CDelay(I2CDLY); 
  SDA_LOW;
  I2CDelay(I2CDLY); 
  SCK_LOW;
  I2CDelay(I2CDLY); 
}

void StopSig(void) //I2C stop signal
{
  I2C_OUT; //SDA,SCK out direction
  SCK_LOW;
  I2CDelay(I2CDLY);
  SDA_LOW;
  I2CDelay(I2CDLY);
  SCK_HIGH;
  I2CDelay(I2CDLY);
  SDA_HIGH;
  I2CDelay(I2CDLY);
}

unsigned char Slaver_AckSig(void) //I2C slave devie acknowledge
{
  unsigned int timeout;
  I2C_IN;          //SDA input,SCK output
  I2CDelay(I2CDLY);
  SCK_HIGH;
  I2CDelay(I2CDLY);
  timeout=0xff;
  while(timeout && CHK_SDA){timeout--;}           //check SDA status and timeout mechanism initiation
  if(timeout) {SCK_LOW;I2C_OUT;return SUCCESS;}   //slave node responsive
  else {StopSig();return FAILURE;}                //slave node unresponsive
}

void Master_AckSig(void)  //I2C master device acknowledge
{
  SCK_LOW;
  I2CDelay(I2CDLY);
  SDA_LOW;
  I2C_OUT;  
  I2CDelay(I2CDLY);
  SCK_HIGH;
  I2CDelay(I2CDLY);
  SCK_LOW;
  I2CDelay(I2CDLY);
}

void Master_NAckSig(void) //I2C master device non-acknowledge
{
  SCK_LOW;
  I2CDelay(I2CDLY);
  SDA_HIGH;  
  I2C_OUT;
  I2CDelay(I2CDLY);
  SCK_HIGH;
  I2CDelay(I2CDLY);
  SCK_LOW;
  I2CDelay(I2CDLY);
}

unsigned char WrI2C(unsigned char c)    //wirte one byte to I2C slave device
{
 unsigned char cnt,timeout;
 for(cnt=0;cnt<8;cnt++)                 //sending 8-bit continuously, MSB first
 {
   if(c & 0x80) SDA_HIGH;               //SDA='1'
   else SDA_LOW;                        //SDA='0'
   I2CDelay(I2CDLY>>1);
   SCK_HIGH;
   I2CDelay(I2CDLY);
   c<<=1;                               //ready tx next bit
   SCK_LOW;
   I2CDelay(I2CDLY);  
 }
   I2C_IN;                              //SDA input,SCK output
   I2CDelay(I2CDLY);  
   SCK_HIGH;
   timeout=0xff;
   while(timeout && CHK_SDA){timeout--;}//check SDA status and timeout mechanism initiation
   if(timeout)                          //salve acknowledge is response
   {
     SCK_LOW;
     I2C_OUT;
     return SUCCESS;                    //slave node response
   }         
   else {StopSig();return FAILURE;}     //slave node unresponsive
}

unsigned char RdI2C(void)               //read one byte from I2C salve device
{
 unsigned char cnt;
 unsigned char temp;
 I2C_IN;                               //SDA input,SCK output
 SCK_LOW;
 I2CDelay(I2CDLY);
 for(cnt=0,temp=0;cnt<8;cnt++)         //read 8-bit from slave,MSB first
 {
  SCK_HIGH;
  I2CDelay(I2CDLY);                           
  temp<<=1;                            
  if(CHK_SDA) {temp|=0x01;}            //SDA='1'
  SCK_LOW;
  I2CDelay(I2CDLY);
 }
 return temp;
}

unsigned  I2CWrByte(unsigned char addr,unsigned char c) //I2C portocol writting
{
  StartSig();                       //sending I2C initiation signal
  if(WrI2C(addr))  return FAILURE;  //sending salve I2C device address
  if(WrI2C(c))     return FAILURE;  //sending data to salve device
  StopSig();                        //sending I2C stop signal
  return SUCCESS;
}

unsigned I2CRdByte(unsigned char addr,unsigned char *p)
{
  StartSig();                         //sending I2C initiation signal
  if(WrI2C(addr)) {return FAILURE;};  //sending salve I2C device address
  *p=RdI2C();                         //read one byte from salve node
  Master_NAckSig();                   //sending master non-acknowledge signal for stopping 
  StopSig();                          //sending I2C stop signal
 return SUCCESS;
}

//following routines used for I2C memory device
unsigned I2CRdMem(unsigned char addr,unsigned char total,unsigned char *p)
{
 unsigned char cnt;
 if(AddrSetting(addr & 0xFE,*p,*(p+1))) return FAILURE;  //writting I2C device logice address
 StartSig();                                             //starting signal
 if(WrI2C(addr)) { return FAILURE;}                      //writting memory address
 for(cnt=2;cnt<total+2;cnt++)                            //read n bytes to memory 
 {
  *(p+cnt)=RdI2C();                                      //read one byte
  if(cnt==total+1) Master_NAckSig();                     //master NACK for stopping I2C transaction
  else Master_AckSig();                                  //master ACK 
 }
 StopSig();                                              //stop I2C 
 return SUCCESS;
}

unsigned char I2CWrMem(unsigned char addr,unsigned char total,unsigned char *p)
{
 unsigned char cnt; 
 StartSig();                                             //starting signal
 if(WrI2C(addr)) return FAILURE;                         //writting I2C device logic address
 for(cnt=0;cnt<total+2;cnt++)  WrI2C(*(p+cnt));          //writting two-byte for locating the beging address in memory
 StopSig();                                              //stop I2C
 return SUCCESS;
}

unsigned char AddrSetting(unsigned char I2CAddr,unsigned char memhi,unsigned char memlo)
{
 StartSig();                                             //starting signal
 if(WrI2C(I2CAddr)) return FAILURE;                      //writting I2C device logic address
 if(WrI2C(memhi)) return FAILURE;                        //writting memory high address
 if(WrI2C(memlo)) return FAILURE;                        //writting memory low address
 return SUCCESS;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -