MSP430FR5739实现模拟IIC
我使用的是MSP430Fr5739的芯片。下面直接放代码了。
#include "io430.h"
// P1.0 SCL
// P1.2 SDA
#define SCL_HIGH P1OUT|=BIT0
#define SCL_LOW P1OUT&=~BIT0
#define SDA_HIGH P1OUT|=BIT2
#define SDA_LOW P1OUT&=~BIT2
#define SDA_OUT P1DIR|=BIT2
#define SDA_IN P1DIR&=~BIT2
#define SCL_OUT P1DIR|=BIT0
#define SDA P1IN&BIT2
void IIC_start()
{
SDA_OUT;
SCL_OUT;
SCL_HIGH;
SDA_HIGH;
__delay_cycles(10);
SDA_LOW;
__delay_cycles(10);
SCL_LOW;
}
void IIC_stop()
{
SDA_OUT;
SCL_OUT;
SCL_LOW;
SDA_LOW;
__delay_cycles(10);
SCL_HIGH;
__delay_cycles(10);
SDA_HIGH;
__delay_cycles(10);
}
void IIC_writebyte(unsigned char IIC_byte)
{
unsigned char i;
SDA_OUT;
SCL_OUT;
SCL_LOW;
__delay_cycles(10);
for(i=0;i<8;i++)
{
if(IIC_byte&0x80) //写1
SDA_HIGH;
else //写0
SDA_LOW;
__delay_cycles(10);
SCL_HIGH;
__delay_cycles(10);
SCL_LOW;
__delay_cycles(10);
IIC_byte<<=1; //循环左移,取最高位
}
}
unsigned char IIC_readebyte()
{
unsigned char i,k=0;
SDA_IN; //SDA设置为输入
SCL_OUT;
SCL_LOW;
__delay_cycles(50);
for(i=0;i<8;i++)
{
SCL_HIGH;
k=k<<1;
if(SDA)
k|=1;
SCL_LOW;
__delay_cycles(50);
}
SDA_OUT; //SDA设置为输出
__delay_cycles(50);
return k;
}
unsigned char IIC_testACK()
{
SCL_LOW;
//SDA_IN; //SDA设置为输入
//SDA_UP;
__delay_cycles(50);
SCL_HIGH;
__delay_cycles(50);
SCL_LOW;
//SDA_OUT; //SDA设置为输出
__delay_cycles(50);
return 1;
}
void IIC_masterACK()
{
SDA_OUT;
SCL_OUT;
SCL_LOW;
SDA_LOW;
SCL_HIGH;
__delay_cycles(5);
SCL_LOW;
__delay_cycles(5);
}
void IIC_masterNACK()
{
SDA_OUT;
SCL_OUT;
SCL_LOW;
SDA_HIGH;
__delay_cycles(5);
SCL_HIGH;
__delay_cycles(5);
SCL_LOW;
__delay_cycles(5);
}