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

📄 io_i2c.c

📁 基于MSP430247的模拟I2C的程序
💻 C
字号:
#include"msp430x24x.h"
#include"delay.h"
#define SCL_SEL P3SEL
#define SCL_DIR P3DIR
#define SCL_OUT P3OUT
#define SCL_IN  P3IN
#define SCL_BIT  2

#define SDA_SEL P3SEL
#define SDA_DIR P3DIR
#define SDA_OUT P3OUT
#define SDA_IN  P3IN
#define SDA_BIT  1

/*void delay_1ms(void)                 //1ms延时函数
  {
   unsigned int i;
   for (i=0;i<80;i++);
  }
  
void delay_nms(unsigned int n)       //N ms延时函数
  {
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1ms();
  }
*/
void Lining_SDA_High()
{
SDA_DIR |=(1<<SDA_BIT);
SDA_OUT |=(1<<SDA_BIT);
_NOP();
_NOP();
}
void Lining_SDA_Low()
{
SDA_DIR |=(1<<SDA_BIT);
SDA_OUT &=~(1<<SDA_BIT);
_NOP();
_NOP();
}
void Lining_SCL_High()
{
SCL_DIR |=(1<<SCL_BIT);
SCL_OUT |=(1<<SCL_BIT);
_NOP();
_NOP();
}
void Lining_SCL_Low()
{
SCL_DIR |=(1<<SCL_BIT);
SCL_OUT &=~(1<<SCL_BIT);
_NOP();
_NOP();
}

void Lining_I2C_START()
{
unsigned char i;
Lining_SDA_High();
for(i=0;i<5;i++);
Lining_SCL_High();
for(i=0;i<5;i++);
Lining_SDA_Low();
for(i=0;i<5;i++);
Lining_SCL_Low();
}

void Lining_I2C_STOP()
{
unsigned char i;
Lining_SDA_Low();
for(i=0;i<5;i++);
Lining_SCL_Low();
for(i=0;i<5;i++);
Lining_SCL_High();
for(i=0;i<5;i++);
Lining_SDA_High();
for(i=0;i<5;i++);
Lining_SCL_Low();
delay_nms(10);
}


void Lining_SetACK()
{
Lining_SDA_Low();
_NOP();
_NOP();
Lining_SCL_High();
delay_1ms();
Lining_SCL_Low();
_NOP();
_NOP();
Lining_SDA_High();
}
void Lining_SetNACK()
{
Lining_SDA_High();
_NOP();
_NOP();
Lining_SCL_High();
delay_1ms();
Lining_SCL_Low();
_NOP();
_NOP();
Lining_SDA_Low();
}
unsigned char  Lining_GetACK()
{
unsigned char ack;
Lining_SCL_Low();
_NOP();
_NOP();
SDA_DIR &=~(1<<SDA_BIT);
Lining_SCL_High();
_NOP();
_NOP();
ack=P3IN&(1<<SDA_BIT );
_NOP();
_NOP();
Lining_SCL_Low();
delay_1ms();
if(ack)    
  return 0;
    else
  return 1;
}

void Lining_SendByte(unsigned char data)
{
unsigned char i,j;
for(i=0;i<8;i++)
     {  
       if((data&0x80)==0x80) 
            Lining_SDA_High();
         else 
            Lining_SDA_Low();
        for(j=0;j<10;j++);
        Lining_SCL_High();
         data<<=1;
        delay_1ms();
        Lining_SCL_Low();
       
    }
}
unsigned char Lining_ReadByte()
{
unsigned char i;
unsigned char buffer=0;
unsigned char receive_data=0;
SDA_DIR &=~(1<<SDA_BIT);
for(i=0;i<8;i++)
  {
   Lining_SCL_High();
   _NOP();
   _NOP();
   _NOP();
   _NOP();
   _NOP();
   _NOP();
   buffer=P3IN&(1<<SDA_BIT );
   receive_data<<=1;
   if(buffer)
     receive_data |=0x01;
   else
     receive_data |=0x00;
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    _NOP();
   Lining_SCL_Low();
  }
return receive_data;
}

unsigned char  Lining_Write_EEPROM(unsigned int address,unsigned char data)
{
unsigned char  i;
unsigned char j=0;
unsigned char buffer[4];
buffer[0]=0xA0;
buffer[1]=address>>8;
buffer[2]=address;
buffer[3]=data;
Lining_I2C_START();
for(i=0;i<4;i++)
  {
                Lining_SendByte(buffer[j]);
                if(Lining_GetACK())      
		{
			j++;			
		}
		else 
		{
			Lining_I2C_STOP();
			return 0;
		}
  }
Lining_I2C_STOP();
return 1;
}
unsigned char Lining_Read_EEPROM(unsigned int address,unsigned char *p1)
{

unsigned char buffer;
Lining_I2C_START();
  Lining_SendByte(0xA0);
  if(Lining_GetACK())  
    Lining_SendByte(address>>8);
  else
    return 0;
  if(Lining_GetACK())  
    Lining_SendByte(address);
  else
    return 0;
  if(Lining_GetACK()) 
    {
    Lining_I2C_START();
    Lining_SendByte(0xA1);
    }
  else
    return 0;
  if(Lining_GetACK()) 
    buffer=Lining_ReadByte();
  else 
    return 0;
  *p1=buffer;
  Lining_SetACK();
  Lining_I2C_STOP();
   return 1;
}
/*void main()
{
  WDTCTL = WDTPW + WDTHOLD;
  P4DIR=0xFF;
  P4OUT=0x00;
  while(!Lining_Write_EEPROM(0x8309,0x88));
  P4OUT=Lining_Read_EEPROM(0x830a);
  }*/

⌨️ 快捷键说明

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