中易网

AM2301我根据51例程改成STM32的,但是我读出来的数据总是不稳定,而且总是无法校验

答案:2  悬赏:60  
解决时间 2021-01-15 22:28
  • 提问者网友:那叫心脏的地方装的都是你
  • 2021-01-14 21:54
AM2301我根据51例程改成STM32的,但是我读出来的数据总是不稳定,而且总是无法校验
最佳答案
  • 二级知识专家网友:骨子里都是戏
  • 2021-01-14 23:13
//-------------------------------------------------------------------------
//读数据
//reg_add 数据起始地址
//*data 都回数据存放地址
//len 要读的数据长度
//-------------------------------------------------------------------------
unsigned int Read_AM23x1(uint8_t reg_add,uint8_t *data,uint8_t len)
{
unsigned int i;
if((reg_add>0x1f)||(len>7))
return 0;
TWI_START();
if(TWI_SendByte(0xB8))//写
{
USART_Buf[0]=TWI_SendByte(0x03);//
USART_Buf[1]=TWI_SendByte(reg_add);//
USART_Buf[2]=TWI_SendByte(len);//
TWI_STOP();
}
else
return 0;

i = TIM_GetCounter(TIM2);
TIM_SetCompare3(TIM2,i+4000); // 延时2ms再读
TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
TIM_ITConfig(TIM2, TIM_IT_CC3, ENABLE); //开TIM2通道3的捕捉比较中断
delay_flag=0;
while(delay_flag==0); //等待延时标志位
TWI_START();
if(TWI_SendByte(0xB9))//读
{
for(i=0;i<120;i++);
//TWI_ReceiveByte();//读回功能码0x03
//TWI_ReceiveByte();//读回长度0x04
for(i=0;i{
*data++=TWI_ReceiveByte();
TWI_SendACK();
}
TWI_SendNACK();
TWI_STOP();
return 1;
}
else
return 0;
}
//-------------------------------------------------------------------------
//唤醒
//reg_add 数据起始地址
//*data 都回数据存放地址
//len 要读的数据长度
//-------------------------------------------------------------------------
void WAKE_UP_AM23x1(void)
{
u32 temp;
TWI_START();
TWI_SendByte(0xB8);//写地址
//TWI_SendNACK();
temp = TIM_GetCounter(TIM2);
TIM_SetCompare3(TIM2, temp+3000); // 延时1.5ms
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE); //开TIM2通道2的捕捉比较中断
delay_flag=0;
while(delay_flag==0); //等待延时标志位
TWI_STOP();
}

以前写的,读温湿度然后串口输出,程序调通后就没再去动过,所以没怎么优化,比如延时那里。
我用管脚模拟的IIC,STM32那个半残的硬件IIC还是别用的好
全部回答
  • 1楼网友:举杯邀酒敬孤独
  • 2021-01-15 00:07
可以认定是99%的概率是你的问题,而不是半残的意法半导体
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息