📄 io_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 + -