本帖最后由 joly314 于 2014-5-26 22:17 编辑
/********************************************************
* 文件名称:
* tmp275.c
* 文件说明:
* 使用口线模拟IIC读取 tmp275 温度值
口对应: SDA--P6.7 SCL--P6.6
*********************************************************/
#include <msp430x44x.h>
#define uchar unsigned char
#define uint unsigned int
/*********************************************************
相关口及寄存器定义,若要换IO口,只需修改这7句即可
*********************************************************/
#define OUTPUT_ZERO P6OUT &= ~(BIT6+BIT7)
#define IN P6IN
#define SDA BIT7
#define SDA_HIGH P6DIR &= ~BIT7
#define SDA_LOW P6DIR |= BIT7
#define SCL_HIGH P6DIR &= ~BIT6
#define SCL_LOW P6DIR |= BIT6
/*********************************************************
* 数据定义
*********************************************************/
unsigned char temp1, //温度值高字节
temp2, //温度值低字节
ack_Flag; //应答标识
/************************************************
* 延迟
************************************************/
void iic_Delay(void)
{
_NOP();
_NOP();
_NOP();
}
/*********************************************************
* 启动IIC
*********************************************************/
void start_IIC(void)
{
OUTPUT_ZERO; //设置P6OUT
SDA_HIGH; //SDA = 1
iic_Delay();
SCL_HIGH; //SCL = 1
iic_Delay();
SDA_LOW; //SDA = 0
iic_Delay();
SCL_LOW; //SCL = 0
iic_Delay();
}
/*******************************************************
* 停止IIC
*******************************************************/
void stop_IIC(void)
{
SDA_LOW; //SDA = 0
iic_Delay();
SCL_HIGH; //SCL = 1
iic_Delay();
SDA_HIGH; //SDA = 1
iic_Delay();
SDA_LOW; //SDA = 0
iic_Delay();
SCL_LOW; //SCL = 0
}
/*******************************************************
* 发送 0
*******************************************************/
void send_Zero(void)
{
SDA_LOW; //SDA = 0
iic_Delay();
SCL_HIGH; //SCL = 1
iic_Delay();
SCL_LOW; //SCL = 0
iic_Delay();
}
/*******************************************************
* 发送 1
*******************************************************/
void send_One(void)
{
SDA_HIGH; //SDA = 1
iic_Delay();
SCL_HIGH; //SCL = 1
iic_Delay();
SCL_LOW; //SCL = 0
iic_Delay();
SDA_LOW; //SDA = 0
// iic_Delay();
}
/*******************************************************
* 发送一个字节数据
*******************************************************/
void send_Char(uchar x)
{
uchar cnt,tmp=0x80;
for(cnt=0;cnt<8;cnt++)
{
if((x & tmp )> 0)
send_One(); // 发送1
else
send_Zero(); // 发送0
tmp /= 2; // tmp右移一位
}
}
/*******************************************************
* 读一个byte数据
*******************************************************/
uchar read_Char(void)
{
uchar cnt,tmp=0x80;
uchar x = 0x00;
for(cnt=0;cnt<8;cnt++)
{
SDA_HIGH; //SDA = 1
iic_Delay();
SCL_HIGH; //SCL = 1
iic_Delay();
if((IN & SDA) > 0x00) // 收到 1
x |= tmp;
SCL_LOW; //SCL = 0
iic_Delay();
tmp = tmp/2;
}
return x;
}
/*************************************************
* 应答信号
*************************************************/
void iic_ACK(void)
{
ack_Flag = 0x00;
SDA_HIGH; //SDA = 1
iic_Delay();
SCL_HIGH; //SCL = 1
iic_Delay();
if ((IN & BIT7) >0 )
{
ack_Flag = 1;
}
SCL_LOW; //SCL = 0
iic_Delay();
}
/***********************************************
* iic_NACK
************************************************/
void iic_NACK(void)
{
SDA_LOW; //SDA = 0
iic_Delay();
SCL_HIGH; //SCL = 1
iic_Delay();
SCL_LOW; //SCL = 0
iic_Delay();
}
/************************************************
* 写一个数据到tmp275
*************************************************/
void write_tmp275(uchar register_addr,uchar content)
{
start_IIC(); // 启动 I2c
send_Char(0x90); // 发送器件地址
iic_ACK(); // 确认
send_Char(register_addr); // 发送寄存器地址
iic_ACK(); // 读确认
send_Char(content); // 写入数值
iic_ACK(); // 读响应信息
stop_IIC(); // 停止 IIC
}
/*************************************************
* 从tmp275读数据
*************************************************/
void read_temperature(void)
{
start_IIC(); //启动 I2c
send_Char(0x90);//发送器件地址
iic_ACK(); //读取应答
send_Char(0x00); // 发送寄存器地址
iic_ACK(); // 读响应
start_IIC(); //启动 I2c
send_Char(0x91); // 发送器件地址
iic_ACK(); // 获取响应
temp1 = read_Char(); //读温度寄存器高字节
iic_NACK(); // 主设备发响应
temp2 = read_Char(); //读温度寄存器高字节
iic_NACK(); // 主设备发响应
stop_IIC(); // 停止 IIC
}
/********************************************************
* 文件名称:
* tmp275.c
* 文件说明:
* 使用口线模拟IIC读取 tmp275 温度值
口对应: SDA--P6.7 SCL--P6.6
*********************************************************/
#include <msp430x44x.h>
#define uchar unsigned char
#define uint unsigned int
/*********************************************************
相关口及寄存器定义,若要换IO口,只需修改这7句即可
*********************************************************/
#define OUTPUT_ZERO P6OUT &= ~(BIT6+BIT7)
#define IN P6IN
#define SDA BIT7
#define SDA_HIGH P6DIR &= ~BIT7
#define SDA_LOW P6DIR |= BIT7
#define SCL_HIGH P6DIR &= ~BIT6
#define SCL_LOW P6DIR |= BIT6
/*********************************************************
* 数据定义
*********************************************************/
unsigned char temp1, //温度值高字节
temp2, //温度值低字节
ack_Flag; //应答标识
/************************************************
* 延迟
************************************************/
void iic_Delay(void)
{
_NOP();
_NOP();
_NOP();
}
/*********************************************************
* 启动IIC
*********************************************************/
void start_IIC(void)
{
OUTPUT_ZERO; //设置P6OUT
SDA_HIGH; //SDA = 1
iic_Delay();
SCL_HIGH; //SCL = 1
iic_Delay();
SDA_LOW; //SDA = 0
iic_Delay();
SCL_LOW; //SCL = 0
iic_Delay();
}
/*******************************************************
* 停止IIC
*******************************************************/
void stop_IIC(void)
{
SDA_LOW; //SDA = 0
iic_Delay();
SCL_HIGH; //SCL = 1
iic_Delay();
SDA_HIGH; //SDA = 1
iic_Delay();
SDA_LOW; //SDA = 0
iic_Delay();
SCL_LOW; //SCL = 0
}
/*******************************************************
* 发送 0
*******************************************************/
void send_Zero(void)
{
SDA_LOW; //SDA = 0
iic_Delay();
SCL_HIGH; //SCL = 1
iic_Delay();
SCL_LOW; //SCL = 0
iic_Delay();
}
/*******************************************************
* 发送 1
*******************************************************/
void send_One(void)
{
SDA_HIGH; //SDA = 1
iic_Delay();
SCL_HIGH; //SCL = 1
iic_Delay();
SCL_LOW; //SCL = 0
iic_Delay();
SDA_LOW; //SDA = 0
// iic_Delay();
}
/*******************************************************
* 发送一个字节数据
*******************************************************/
void send_Char(uchar x)
{
uchar cnt,tmp=0x80;
for(cnt=0;cnt<8;cnt++)
{
if((x & tmp )> 0)
send_One(); // 发送1
else
send_Zero(); // 发送0
tmp /= 2; // tmp右移一位
}
}
/*******************************************************
* 读一个byte数据
*******************************************************/
uchar read_Char(void)
{
uchar cnt,tmp=0x80;
uchar x = 0x00;
for(cnt=0;cnt<8;cnt++)
{
SDA_HIGH; //SDA = 1
iic_Delay();
SCL_HIGH; //SCL = 1
iic_Delay();
if((IN & SDA) > 0x00) // 收到 1
x |= tmp;
SCL_LOW; //SCL = 0
iic_Delay();
tmp = tmp/2;
}
return x;
}
/*************************************************
* 应答信号
*************************************************/
void iic_ACK(void)
{
ack_Flag = 0x00;
SDA_HIGH; //SDA = 1
iic_Delay();
SCL_HIGH; //SCL = 1
iic_Delay();
if ((IN & BIT7) >0 )
{
ack_Flag = 1;
}
SCL_LOW; //SCL = 0
iic_Delay();
}
/***********************************************
* iic_NACK
************************************************/
void iic_NACK(void)
{
SDA_LOW; //SDA = 0
iic_Delay();
SCL_HIGH; //SCL = 1
iic_Delay();
SCL_LOW; //SCL = 0
iic_Delay();
}
/************************************************
* 写一个数据到tmp275
*************************************************/
void write_tmp275(uchar register_addr,uchar content)
{
start_IIC(); // 启动 I2c
send_Char(0x90); // 发送器件地址
iic_ACK(); // 确认
send_Char(register_addr); // 发送寄存器地址
iic_ACK(); // 读确认
send_Char(content); // 写入数值
iic_ACK(); // 读响应信息
stop_IIC(); // 停止 IIC
}
/*************************************************
* 从tmp275读数据
*************************************************/
void read_temperature(void)
{
start_IIC(); //启动 I2c
send_Char(0x90);//发送器件地址
iic_ACK(); //读取应答
send_Char(0x00); // 发送寄存器地址
iic_ACK(); // 读响应
start_IIC(); //启动 I2c
send_Char(0x91); // 发送器件地址
iic_ACK(); // 获取响应
temp1 = read_Char(); //读温度寄存器高字节
iic_NACK(); // 主设备发响应
temp2 = read_Char(); //读温度寄存器高字节
iic_NACK(); // 主设备发响应
stop_IIC(); // 停止 IIC
}
上面这个程序网上下的,说是MSP430上验证过的,转成C51也不能读出来,真不知道问题在哪,郁闷啊
|