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

📄 iic.c

📁 基于MSP430的I2C驱动程序
💻 C
字号:
#include <MSP430X14X.H>

#define IIC_PORT_DIR  P5DIR   //==SDA 接P5.1 ;SCL接 P5.0 ,INT接P2.5
#define IIC_PORT_IN   P5IN
#define IIC_PORT_OUT  P5OUT
#define SDA    BIT1
#define SCL    BIT0
#define SDA_1  (IIC_PORT_DIR &= ~SDA)  //数据总线默认为1,设置SDA为输入口则SDA=1
#define SDA_0  (IIC_PORT_DIR |= SDA)   //SDA输出寄存器始终为0,当设置SDA为输出口 SDA=0
#define SCL_1  (IIC_PORT_OUT |=SCL)
#define SCL_0  (IIC_PORT_OUT &=~SCL)
#define IIC_TIME 100

void delay(unsigned int time)
{
 while(--time)WDTCTL=WDTPW+WDTCNTCL;
}

void iic_init(void)
{
 IIC_PORT_DIR |= (SCL);
 SDA_1;
 IIC_PORT_OUT &= ~SDA;
}
/*******************************************************************
                     起动总线函数               
函数原型: void  Start_I2c();  
功能:启动I2C总线,即发送I2C起始条件.
  
********************************************************************/
void Start_I2c(void)
{
 SDA_1; delay(IIC_TIME);
 SCL_1; delay(IIC_TIME);
 SDA_0; delay(IIC_TIME);
 SCL_0; delay(IIC_TIME);
}
/*******************************************************************
                      结束总线函数               
函数原型: void  Stop_I2c();  
功能:       结束I2C总线,即发送I2C结束条件.
  
********************************************************************/
void Stop_I2c(void)
{
 SDA_0; delay(IIC_TIME);
 SCL_1; delay(IIC_TIME);
 SDA_1; delay(IIC_TIME);
 SCL_0; delay(IIC_TIME);
}
/*******************************************************************
                 字节数据传送函数               
函数原型: void  SendByte(uchar c);
功能:  将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
     此状态位进行操作.(不应答或非应答都使ack=0 假)     
     发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/
void  SendByte(unsigned char  ch)
{
 unsigned char i = 8;
 SCL_0; delay(IIC_TIME);  
 while(i--)
 {
  SDA_0;    
  if(ch & 0x80)SDA_1;
  ch <<= 1;
  delay(IIC_TIME);  
  SCL_1; delay(IIC_TIME);  
  SCL_0; delay(IIC_TIME);  
 }  
}
/*******************************************************************
                 字节数据接收函数               
函数原型: uchar  RcvByte();
功能:  用来接收从器件传来的数据,并判断总线错误(不发应答信号),
     发完后请用应答函数。  
********************************************************************/	
unsigned char  RcvByte(void)
{
 unsigned char rdata = 0;
 unsigned char i = 8;
 SDA_1;            // 改成输入模式
 delay(IIC_TIME);
 while(i--)
 {
  rdata <<= 1;
  SCL_0; delay(IIC_TIME);  
  SCL_1; delay(IIC_TIME);  
  if(IIC_PORT_IN &SDA) rdata |= 0x01; // 读入数据         
 }
 delay(IIC_TIME);
 return(rdata);
}

/********************************************************************
                     应答子函数
原型:  void Ack_I2c(bit a);
 
功能:主控器进行应答信号,(可以是应答或非应答信号)
********************************************************************/
void Ack_I2c(void)
{
 unsigned int tmp;
 SDA_1; delay(IIC_TIME);
 delay(IIC_TIME);
 SCL_0; delay(IIC_TIME);
 SCL_1; delay(IIC_TIME);
 tmp = 100;
 while(tmp)
 {
  tmp --;
  if((IIC_PORT_IN &SDA) == 0){_NOP();break;} // 读入数据
 };
 SCL_0; delay(IIC_TIME);  
 delay(IIC_TIME);   
}

void master_ack(void) //主应答函数
{
 SDA_0; delay(IIC_TIME);
 SCL_1; delay(IIC_TIME);
 SCL_0; delay(IIC_TIME);
}

void no_ack(void)
{
 SDA_1; delay(IIC_TIME);
 SCL_1; delay(IIC_TIME);  
 SCL_0; delay(IIC_TIME);  
}

unsigned char TestAck(void)
{
 unsigned char a;
 SDA_1;                   //设为输入
 a=IIC_PORT_IN &SDA;
 return(a); 
}

⌨️ 快捷键说明

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