您的位置 首页 ADAS

MSP430一般I/0口模仿IIC总线

#includemain.h#defineSLAVE_ADDRESS0x04#defineSLAVE_WRITE_ADDRESS(SLAVE_ADDRESS1)

#include “main.h”

#define SLAVE_ADDRESS 0x04
#define SLAVE_WRITE_ADDRESS (SLAVE_ADDRESS<<1)|0x00
#define SLAVE_READ_ADDRESS (SLAVE_ADDRESS<<1)|0x01

#define I2C_SDABIT3
#define I2C_SCLBIT4
#define I2C_PORT_INP6IN
#define I2C_PORT_OUTP6OUT
#define I2C_PORT_DIRP6DIR

#define SDA_IN(I2C_PORT_IN & I2C_SDA)
#define SCL_IN(I2C_PORT_IN & I2C_SCL)
#define S_SDAI2C_PORT_DIR &= ~I2C_SDA
#define C_SDAI2C_PORT_DIR |= I2C_SDA;I2C_PORT_OUT &= ~I2C_SDA
#define S_SCLI2C_PORT_DIR &= ~I2C_SCL
#define C_SCLI2C_PORT_DIR |= I2C_SCL;I2C_PORT_OUT &= ~I2C_SCL

void I2C_init(void)
{
I2C_PORT_DIR &= ~(I2C_SDA|I2C_SCL);
I2C_PORT_OUT |= (I2C_SDA|I2C_SCL);
}

void I2C_DELAY(void)
{
asm(“nop”);asm(“nop”);
asm(“nop”);asm(“nop”);
asm(“nop”);asm(“nop”);
asm(“nop”);asm(“nop”);
}

void I2C_Start(void)
{
S_SDA;
S_SCL;
I2C_DELAY();
C_SDA;
I2C_DELAY();
C_SCL;
}

void I2C_Stop(void)
{
C_SDA;
I2C_DELAY();
S_SCL;
I2C_DELAY();
S_SDA;
I2C_DELAY();
}

void I2C_Send_Ack(void)
{
C_SDA;
I2C_DELAY();
S_SCL;
I2C_DELAY();
C_SCL;
I2C_DELAY();
}

void I2C_Send_NoAck(void)
{
S_SDA;
I2C_DELAY();
S_SCL;
I2C_DELAY();
C_SCL;
I2C_DELAY();
}

void I2C_Read_Ack(void)
{
unsigned char i = 0;
S_SCL;
S_SDA;
I2C_DELAY();
for(i=0; i<100; i++)
{
if(SDA_IN == 0)
{
I2C_DELAY(); break;
}
I2C_DELAY();
}
C_SCL;
I2C_DELAY();
}

void I2C_WriteByte(unsigned char one_byte)
{
unsigned char i = 0;
S_SDA;
for (i=0; i<8; i++)
{
if (one_byte&0x80)
{
S_SDA;
}
else
{
C_SDA;
}
one_byte<<=1;
I2C_DELAY();
S_SCL;
I2C_DELAY();
C_SCL;
I2C_DELAY();
}
}

unsigned char I2C_ReadByte(void)
{
unsigned char read_byte=0;
unsigned char i = 0;
S_SDA;
//C_SCL;
I2C_DELAY();
for (i=0; i<8; i++)
{
S_SCL;
I2C_DELAY();
read_byte<<=1;
if (SDA_IN != 0)
{
read_byte |= 0x01;
}
//I2C_DELAY;
C_SCL;
I2C_DELAY();
}
return read_byte;
}

void I2C_write_Nbyte(unsigned char *pbuf, unsigned char cnt)
{
unsigned char i = 0;
I2C_Start();
I2C_WriteByte(SLAVE_WRITE_ADDRESS);
I2C_Read_Ack();
for (i=0; i {
I2C_DELAY();I2C_DELAY();
I2C_WriteByte(*pbuf);
pbuf++;
I2C_Read_Ack();
}
I2C_Stop();
}

void I2C_read_Nbyte(unsigned char *pbuf, unsigned char cnt)
{
unsigned char i = 0;
I2C_Start();
I2C_WriteByte(SLAVE_READ_ADDRESS);
I2C_Read_Ack();
for (i=1; i {
I2C_DELAY();I2C_DELAY();
*pbuf = I2C_ReadByte();
pbuf++;
I2C_Send_Ack();
}
*pbuf = I2C_ReadByte();
I2C_Stop();
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/adas/273169.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部