微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI无线射频设计 > 关于在协议栈中使用DHT11的问题

关于在协议栈中使用DHT11的问题

时间:12-22 整理:3721RD 点击:

DHT11对时序的要求很高,当在程序中出现,static void Delay_nus(uint16 s) {   while (s--)   {     asm("NOP");     asm("NOP");     asm("NOP");   } }这类的函数的时候,协议栈是不是会对他进行优化呢?我在代码前面已经添加了#pragma optimize=none,是不是还会优化呢?现在是DHT11无法完成初始化,就是时序的问题出现的,请教下大家。

优化是编译干的事,跟协议栈没一点关系。

CC2540跑的是32M 单时钟周期 你看看时序对不对,搞示波器抓抓

示波器显示电平没有变化,从我上电就是高电平,如果不放在协议栈中的话,运行没有问题的。想问下那个初始化函数应该放在哪里?

int main()
{
HAL_BOARD_INIT();
HalLcd_HW_Init();

HalLcd_HW_WriteLine(HAL_LCD_LINE_1, " CC2530EM");
HalLcd_HW_WriteLine(HAL_LCD_LINE_3, "-->DHT11_TEST");
HalLcd_HW_WriteLine(HAL_LCD_LINE_4, "Current hum & temp:");

uint8 hum[10];
uint8 temp[10];
uint8 Sensor[4];
while(1){
ReadValue(Sensor);
IntToStr(hum,Sensor[0]);
IntToStr(temp,Sensor[2]);
HalLcd_HW_WriteLine(HAL_LCD_LINE_5, hum);
HalLcd_HW_WriteLine(HAL_LCD_LINE_6, temp);
HalHW_WaitMS(500);
}
return 0;

这个是我没有协议栈时候的开始函数,现在放到协议栈了,应该如何修改呢?麻烦您了。

IO口方向有没有弄错?

贴出来看看

#define IN_DQ P0_7
#define DQ_PIN 7
#define DQ_PORT P0DIR


#define SET_OUT DQ_PORT|=BV(DQ_PIN);asm("NOP");asm("NOP")
#define SET_IN DQ_PORT&=~(BV(DQ_PIN));asm("NOP");asm("NOP")

#define CL_DQ IN_DQ=0;asm("NOP");asm("NOP")
#define SET_DQ IN_DQ=1;asm("NOP");asm("NOP")

uint8 CheckSum;
uint8 tmp8BitValue;

#pragma optimize=none
static void Delay_nus(uint16 s)
{
while (s--)
{
asm("NOP");
asm("NOP");
asm("NOP");
}
}
#pragma optimize=none
void Read8Bit(void)
{
static uint8 OverTimeCnt = 0;
uint8 i,tmpBit;

for(i=0;i<8;i++)
{
OverTimeCnt = 2;
while((IN_DQ == 0)&&OverTimeCnt++);
//while(IN_DQ == 0);
Delay_nus(19);//12
if(IN_DQ == 1)
tmpBit = 1;
else
tmpBit = 0;
OverTimeCnt = 2;
while((IN_DQ == 1)&&OverTimeCnt++);
//while(IN_DQ == 1);
//超时则跳出for循环
if(OverTimeCnt==1)
break;

tmp8BitValue<<=1;
tmp8BitValue|=tmpBit; //0

}

}


#pragma optimize=none
void ReadValue(uint8 *sv)
{
static uint8 OverTimeCnt = 0;
SET_OUT;
CL_DQ;
Delay_nus(20000);//主机拉低至少18ms
SET_DQ;
Delay_nus(20);//总线由上拉电阻拉高 主机延时20us-40us
SET_IN;
if(IN_DQ == 0)
{
OverTimeCnt = 2;
while((IN_DQ == 0)&&OverTimeCnt++);

while(IN_DQ == 1);
//数据接收状态
Read8Bit();
sv[0]=tmp8BitValue;
Read8Bit();
sv[1]=tmp8BitValue;
Read8Bit();
sv[2]=tmp8BitValue;
Read8Bit();
sv[3]=tmp8BitValue;

Read8Bit();
CheckSum = tmp8BitValue;

if(CheckSum == sv[0]+sv[1]+sv[2]+sv[3])
{
CheckSum = 0xff;

}


}

}

这是所有的代码,单独使用没有问题,就是不知道应该怎么加入协议栈中使用。

32个NOP才是1uS

?你这是怎么算来的?

CC2540接的是32M晶振

是32M,不过不是要12、32吗?

CC2540的8051是增强型额,是单指令周期的

datatsheet写了的

谢谢了,没有注意这一点。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top