📄 iic.c
字号:
/******************************************************************************
* FILE NAME IIC.C
*I2C 主要函数:
*向从机地址为WSLA,子地址为addr 的寄存器发送数据 *buf,数据长度为len
*void TWI_write(unsigned char WSLA,unsigned char addr,unsigned char *buf,unsigned
* char len)
*
*从从机地址为WSLA,子地址为addr 的寄存器读取数据 传回*buf,数据长度为len
*void TWI_read(unsigned char WSLA,unsigned char addr,unsigned char *buf,
* unsigned char len)
*****************************************************************************/
/******************************************************************************
* 定义管脚
* P3.1 ---------------SDA
* P3.3 ---------------SCL
******************************************************************************/
#include <msp430x16x.h>
#include "IIC.h"
#include "delay.h"
/***********************************************************************
** 函数名称: I2C_Set_sck_high
** 功能描述: 时钟线置1
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
***********************************************************************/
void I2C_Set_sck_high(void)
{
P3OUT |= SCL;
}
/***********************************************************************
** 函数名称: I2C_Set_sck_low
** 功能描述: 时钟线置0
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
***********************************************************************/
void I2C_Set_sck_low(void)
{
P3OUT &=~(SCL);
}
/***********************************************************************
** 函数名称: I2C_Set_sda_high
** 功能描述: 数据线置1
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
***********************************************************************/
void I2C_Set_sda_high(void)
{
P3OUT |=SDA;
}
/***********************************************************************
** 函数名称: I2C_Set_sda_low
** 功能描述: 数据线置0
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
***********************************************************************/
void I2C_Set_sda_low(void)
{
P3OUT &=~(SDA);
}
/***********************************************************************
** 函数名称: I2C_Initial
** 功能描述: I2C端口初始化,及时钟线,数据线初始化
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: I2C_Set_sda_high I2C_Set_sck_high
***********************************************************************/
void I2C_Initial(void)
{
unsigned char j;
P3DIR |= SCL;
I2C_Set_sck_high();
for(j=30;j>0;j--);
P3DIR |= SDA;
I2C_Set_sda_high();
for(j=30;j>0;j--);
}
/***********************************************************************
** 函数名称: I2C_GetAck
** 功能描述: 主机读取ACK信号的函数
** 输 入: i : 无
** 输 出: unsigned char 输出1 读到ACK值 输出0 未读到ACK值
** 全局变量: 无
** 调用模块: I2C_Set_sda_high I2C_Set_sck_high
** I2C_Set_sda_low I2C_Set_sck_low
***********************************************************************/
unsigned char I2C_GetAck(void)
{
unsigned char nTemp=0;
unsigned char j;
I2C_Set_sda_high();
for(j=30;j>0;j--);
P3DIR &=~(SDA);
I2C_Set_sck_high();
for(j=30;j>0;j--);
nTemp=P3IN & SDA;//获得数据
I2C_Set_sck_low();
for(j=30;j>0;j--);
P3DIR |= SDA;
return(nTemp & SDA);
}
/***********************************************************************
** 函数名称: I2C_SetAck
** 功能描述: 主机发送ACK信号的函数
** 输 入: unsigned char ack :1 设置ACK 0 设置NACK
** 输 出: 无
** 全局变量: 无
** 调用模块: I2C_Set_sda_high I2C_Set_sck_high
** I2C_Set_sda_low I2C_Set_sck_low
***********************************************************************/
void I2C_SetAck(unsigned char ack)
{
unsigned char j;
if(ack == 1)
{
I2C_Set_sda_high();
for(j=30;j>0;j--);
}
else
{
I2C_Set_sda_low();
for(j=30;j>0;j--);
}
I2C_Set_sck_high();
for(j=30;j>0;j--);
I2C_Set_sck_low();
for(j=30;j>0;j--);
}
/***********************************************************************
** 函数名称: I2C_Start
** 功能描述: 主机发送START信号
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: I2C_Set_sda_high I2C_Set_sck_high
** I2C_Set_sda_low I2C_Set_sck_low
***********************************************************************/
void I2C_Start(void)
{
int i;
I2C_Set_sda_high();
for(i=30;i>0;i--);
I2C_Set_sck_high();
for(i=30;i>0;i--);
I2C_Set_sda_low();
for(i=30;i>0;i--);
I2C_Set_sck_low();
for(i=30;i>0;i--);
}
/***********************************************************************
** 函数名称: I2C_Stop
** 功能描述: 主机发送STOP信号
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: I2C_Set_sda_high I2C_Set_sck_high
** I2C_Set_sda_low I2C_Set_sck_low
***********************************************************************/
void I2C_Stop(void)
{
int i;
I2C_Set_sda_low();
for(i=30;i>0;i--);
I2C_Set_sck_high();
for(i=30;i>0;i--);
I2C_Set_sda_high();
for(i=30;i>0;i--);
Delay_Ms(10);
return;
}
/***********************************************************************
** 函数名称: I2C_TxhTol
** 功能描述: 主机发送一字节数据 MSB FIRST
** 输 入: unsigned char nValue 发送的数据
** 输 出: 无
** 全局变量: 无
** 调用模块: I2C_Set_sda_high I2C_Set_sck_high
** I2C_Set_sda_low I2C_Set_sck_low
***********************************************************************/
void I2C_TxhTol(unsigned char nValue)
{
unsigned char q0,i,j;
P3DIR |= SDA;
for(i=0;i<8;i++)
{
q0=nValue & 0x80;
if(q0==0x80)
I2C_Set_sda_high();
else
I2C_Set_sda_low();
for(j=30;j>0;j--);
I2C_Set_sck_high();
for(j=30;j>0;j--);
I2C_Set_sck_low();
for(j=30;j>0;j--);
nValue=nValue << 1;
}
return;
}
/***********************************************************************
** 函数名称: I2C_RxByte
** 功能描述: 主机读取一字节数据
** 输 入: 无
** 输 出: unsigned char 返回读回的数据
** 全局变量: 无
** 调用模块: I2C_Set_sda_high I2C_Set_sck_high
** I2C_Set_sda_low I2C_Set_sck_low
***********************************************************************/
unsigned char I2C_RxByte(void)
{
unsigned char i,j,q0,nTemp=0;
I2C_Set_sda_high();
for(j=30;j>0;j--);
for(i=0;i<8;i++)
{
I2C_Set_sck_high();
for(j=30;j>0;j--);
nTemp = (nTemp << 1);
P3DIR &=~(SDA);//将SDA管脚设置为输入方向
q0 = ( P3IN & SDA );
if(q0 == SDA)
nTemp |= 0x01;
//for(j=30;j>0;j--);
I2C_Set_sck_low();
for(j=30;j>0;j--);
}
return nTemp;
}
/***********************************************************************
** 函数名称: TWI_write
** 功能描述: 主机向从机地址为 WSLA 寄存器地址为 addr 的寄存器发送
** len 字节数据 数据头指针为*buf
** 输 入: WSLA 从机读地址 addr 从机寄存器地址
** *buf 指向发送数据的指针 len 字节数
** 输 出: 无
** 全局变量: 无
** 调用模块: I2C_GetAck I2C_SetAck I2C_Start I2C_Stop I2C_TxhTol
***********************************************************************/
void TWI_write(unsigned char WSLA,unsigned char addr,unsigned char *buf,unsigned
char len)
{
unsigned char i;
unsigned char nTemp = 0;
nTemp = nTemp;
I2C_Start();
I2C_TxhTol(WSLA);
nTemp = I2C_GetAck();
I2C_TxhTol(addr);
nTemp = I2C_GetAck();
for(i=0;i<len;i++)
{
I2C_TxhTol(buf[i]);
nTemp = I2C_GetAck();
}
I2C_Stop();
}
/***********************************************************************
** 函数名称: TWI_read
** 功能描述: 主机从从机地址为 WSLA 寄存器地址为 addr 的寄存器读取
** len 字节数据 读取的数据存入指针为*buf的地址
** 输 入: WSLA 从机读地址 addr 从机寄存器地址
** *buf 指向存放读取数据地址的指针 len 字节数
** 输 出: 无
** 全局变量: 无
** 调用模块: I2C_GetAck I2C_SetAck I2C_Start I2C_Stop I2C_TxhTol
** I2C_RxByte
***********************************************************************/
void TWI_read(unsigned char WSLA,unsigned char addr,unsigned char *buf,
unsigned char len)
{
unsigned char i;
unsigned char nTemp=0;
nTemp = nTemp;
TWI_write(WSLA,addr,0,0);
Delay_Ms(1);
I2C_Start();
I2C_TxhTol(WSLA+1);
nTemp=I2C_GetAck();
for(i=0;i<len-1;i++)
{
buf[i]=I2C_RxByte();
I2C_SetAck(1);
}
buf[i]=I2C_RxByte();
I2C_SetAck(0);
I2C_Stop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -