OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4214|回复: 2

AM2320温湿度传感器IIC程序

[复制链接]

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
发表于 2018-1-19 16:42:01 | 显示全部楼层 |阅读模式
最近调AM2320这个温湿度传感器模块,用IIC一直出不来,仔细研究数据手册后终于发现问题了,目前ACK应答正常。
IIC部分直接移植正点原子历程的模拟IIC,改下延迟让速率大概在100K就行。(我将所有涉及的都改成了5us)
上AM2320关键代码
//AM23xx唤醒
void AM23xx_WKUP()
{
IIC_Start();
IIC_Send_Byte(0XB8+0);           //发地址
        IIC_SCL=1;  //注意:此处AM23xx不会产生应答,但还是要给个脉冲。原因见AM23xx数据手册。
        delay_us(5);   //或者写IIC_Wait_Ack();但不判断应答
        IIC_SCL=0;       
        delay_us(5);       
//IIC_Wait_Ack();
delay_ms(1);
IIC_Stop();
}
//写入命令
u8 AM23xx_WriteCMD(u8* CMD)
{
        u8 i;
IIC_Start();
IIC_Send_Byte(0XB8+0);           //发地址
         if(IIC_Wait_Ack())
         {
          IIC_Stop();
          return 1;
         }
for(i=0;i<3;i++)       
        {
        IIC_Send_Byte(*(CMD+i));
         if(IIC_Wait_Ack())
         {
          IIC_Stop();
          return 1;
         }
        }
    IIC_Stop();
         return 0;       
}
//读取数据
u8 AM23xx_ReadData(u8* DataBuf)
{ u8 i;
IIC_Start();
IIC_Send_Byte(0XB8+1);           //发地址
if(IIC_Wait_Ack())
        {
          IIC_Stop();
          return 1;
        }
delay_us(50);
for(i=0;i<7;i++)
{
        *(DataBuf+i)=IIC_Read_Byte(1);
}
*(DataBuf+i)=IIC_Read_Byte(0);
IIC_Stop();
return 0;
}


///计算CRC校验码       
unsigned int CRC16(unsigned char *ptr, unsigned char len)
{
   unsigned int crc=0xffff;
   unsigned char i;
   while(len--)
   {
       crc ^=*ptr++;
       for(i=0;i<8;i++)
           {
               if(crc & 0x1)
                   {
                      crc>>=1;
                          crc^=0xa001;
                   }
                   else
                   {
                      crc>>=1;
                   }
           }
   }
   return crc;
}
///检测CRC校验码是否正确
unsigned char CheckCRC(unsigned char *ptr,unsigned char len)
{
  unsigned int crc;
        crc=(unsigned int)CRC16(ptr,len-2);
        if(ptr[len-1]==(crc>>8) && ptr[len-2]==(crc & 0x00ff))
        {
            return 0xff;
        }
        else
        {
           return 0;
        }
}
///读取温湿度值
u8 AM23xx_ReadT_H(int16_t *TMP ,u16 *HR)
{
         u8 AM23xx_DataBuf[8]={0};
AM23xx_WKUP();
if(AM23xx_WriteCMD((u8*)Read_CMD))
   {
          return 1;
         }
delay_ms(2);
if(AM23xx_ReadData(AM23xx_DataBuf))
         {
          return 1;
         }
if(CheckCRC(AM23xx_DataBuf,8))
        {                                               
                                        *HR =  (AM23xx_DataBuf[2]<<8) | AM23xx_DataBuf[3];                                                                          
                                        *TMP = (AM23xx_DataBuf[4]<<8) | AM23xx_DataBuf[5];          
                                   //printf("HUM:%d   TMP:%d\n",*HR,*TMP);
                                 return 0;
        }       
else  return 1;                  
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2018-12-23
在线时间
0 小时
发表于 2018-12-23 21:50:03 | 显示全部楼层
老铁,有源码吗?那个READ_CMD你定义的是啥?
回复 支持 反对

使用道具 举报

13

主题

272

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5390
金钱
5390
注册时间
2017-8-14
在线时间
249 小时
发表于 2020-1-9 11:28:50 | 显示全部楼层
本帖最后由 zml13917492379 于 2020-4-13 22:44 编辑

21CANWeb_STM32F10x开发板AM2320源程序见附件
21CANWeb_STM32F10x开发板AM2320源程序说明200411.zip (152.74 KB, 下载次数: 68)
详细资料扣扣群204408503自行下载
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-26 16:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表