打印
[MCU]

求修改,主芯片为msp430f149,温湿度传感器为iic通讯的SHT20

[复制链接]
714|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
相今2019|  楼主 | 2020-8-19 09:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
对着参考手册看了一遍,还是没找到哪里不对,再加上才接触IIC,对其理解不深刻,身边又没有示波器之类的,难受哦
#ifndef __SHT20_H_
#define __SHT20_H_
#include "msp430x14x.h"
/***************************** 宏定义 *****************************/
#define SCL_H P3OUT |= BIT6
#define SCL_L P3OUT &= ~BIT6
#define SDA_H P3OUT |= BIT7
#define SDA_L P3OUT &= ~BIT7
#define SDA_in P3DIR &= ~BIT7 //SDA 改成输入模式
#define SDA_out P3DIR |= BIT7 //SDA 变回输出模式
#define SDA_val P3IN&BIT7 //SDA 的位值
#define ACK 0
#define NACK 1
#define SHT20ADDR 0x80
void Delay(void);
void Start(void);
void Stop(void);
void Mack(void);
void MNack(void);
unsigned char Check(void);
void Write1(void);
void Write0(void);
unsigned char WriteByte(unsigned char wdata);
unsigned char ReadByte(void);
void Delay_10ms();
float Sht21Work(unsigned char order);
#endif


#include "sht20.h"
/*****************************************************************
【函数名称】 Start
【功 能】完成 IIC 的起始条件操作
【参 数】无
【返回值 】无
*****************************************************************/
void Start(void)
{
SCL_H;
SDA_H;
delay_us(15);
SDA_L;
delay_us(15);
SCL_L;
delay_us(15);

}
/*****************************************************************
【函数名称】 Stop
【功 能】完成 IIC 的终止条件操作
【参 数】无
【返回值 】无
*****************************************************************/
void Stop(void)
{
SDA_L;
delay_us(15);
SCL_H;
delay_us(15);
SDA_H;
delay_us(15);
}
/*****************************************************************
【函数名称】 Mack
【功 能】完成 IIC 的主机应答操作
【参 数】无
【返回值 】无
*****************************************************************/
void Mack(void)
{
SDA_L;
_NOP(); _NOP();
SCL_H;
delay_us(15);
SCL_L;
_NOP(); _NOP();
SDA_H;
delay_us(15);
}
/*****************************************************************
【函数名称】 MNack
【功 能】完成 IIC 的主机无应答操作
【参 数】无
【返回值 】无
*****************************************************************/
void MNack(void)
{
SDA_H;
_NOP(); _NOP();
SCL_H;
delay_us(15);
SCL_L;
_NOP(); _NOP();
SDA_L;
delay_us(15);
}
/*****************************************************************
【函数名称】 Check
【功 能】检查从机的应答操作 ,1--有, 0--无
【参 数】无
【返回值 】ACK (应答信号) or NACK (非应答信号)
*****************************************************************/
unsigned char Check(void)
{
unsigned char ack;
SDA_H;
_NOP(); _NOP();
SCL_H;
_NOP(); _NOP();
SDA_in;
_NOP(); _NOP();
ack = SDA_val; //读入 SDA 数值
SCL_L;
delay_us(15);
SDA_out;
if(ack) return NACK;
else return ACK;
}
/*****************************************************************
【函数名称】 Write1
【功 能】向 IIC 总线发送一个 1
【参 数】无
【返回值 】无
*****************************************************************/
void Write1(void)
{
SDA_H;
delay_us(15);
SCL_H;
delay_us(15);
SCL_L;
delay_us(15);
}
/*****************************************************************
【函数名称】 Write0
【功 能】向 IIC 总线发送一个 0
【参 数】无
【返回值 】无
*****************************************************************/
void Write0(void)
{
SDA_L;
delay_us(15);
SCL_H;
delay_us(15);
SCL_L;
delay_us(15);
}
/*****************************************************************
【函数名称】 WriteByte
【功 能】向 IIC 总线发送一个字节
【参 数】 wdata 为待写数据
【返回值 】respond 为从机返回的应答信号
*****************************************************************/
unsigned char WriteByte(unsigned char wdata)
{
unsigned char i,respond;
for(i = 8;i > 0;i--)
{
if(wdata & 0x80)
Write1();
else
Write0();
wdata <<= 1;
}
SDA_H;
_NOP();
respond = Check();
return respond;
}
/*****************************************************************
【函数名称】 ReadByte
【功 能】从 IIC 总线读取一个字节
【参 数】无
【返回值 】rdata 为读取的数据
*****************************************************************/
unsigned char ReadByte(void)
{
unsigned char rdata = 0x00,i;
unsigned char flag;
for(i = 0;i < 8;i++)
{
SDA_H;
delay_us(15);
SCL_H;
SDA_in;
delay_us(15);
flag = SDA_val;
rdata <<= 1;
if(flag)
rdata |= 0x01;
SDA_out;
SCL_L;
delay_us(15);
}
return rdata;
}
/*****************************************************************
【函数名称】 Sht21Work
【功 能】 Sht21 测量温湿度
【参 数】 order = 0xf3 时测量温度; order = 0xf5 时测量湿度
【返回值 】wendu、shidu
*****************************************************************/
float Sht21Work(unsigned char order)
{
float temp = 0,TH = 0;
unsigned char MSB,LSB;
Start();
if(WriteByte(SHT20ADDR & 0xfe) == ACK)
{
if(WriteByte(order) == ACK)
{
do
{
delay_ms(10);
Start();
}while(WriteByte(SHT20ADDR | 0x01) == NACK);
MSB = ReadByte();
Mack();
LSB = ReadByte();
MNack();
Stop();
LSB &= 0xfc;
temp = MSB*256+LSB;
if (order == 0xf3)
{
TH = ((float)temp * 0.00268127) - 46.85;
return TH;
}
else
{
TH = ((float)temp * 0.00190734) - 46.85;
return TH;
}
}
}
return 1;
}

使用特权

评论回复

相关帖子

沙发
airwill| | 2020-8-19 20:59 | 只看该作者
没有示波器,  调试时序确实是个难题!  可以考虑购个便宜的逻辑分析仪

使用特权

评论回复
板凳
zhangmangui| | 2020-8-19 22:54 | 只看该作者
对着时序看  GPIO模拟的我觉得很好对清楚

使用特权

评论回复
地板
zhangmangui| | 2020-8-19 22:55 | 只看该作者
看看地址对不对   start时序对不对

使用特权

评论回复
5
相今2019|  楼主 | 2020-8-21 17:05 | 只看该作者
调通了,但传输的数据不对,怎么破?

使用特权

评论回复
6
xinghe280| | 2020-8-22 11:26 | 只看该作者
调试一下看看哪里有问题呀

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

32

帖子

0

粉丝