STM32IIC接收到的数据都是0x40怎么办

STM32F103VET6_IIC接收到的数据都是0x40怎么办

是和iS-AQM-D-1空气质量传感器通信的

 IIC上的每个器件是否都要一个地址寄存器来确定自己的地址:很多器件都是通过硬件来确定地址的。
  有的在出厂时地址就设置好了,用户不可以更改,有的确定了几位,剩下几位由硬件确定(比如有三位由用户确定,就留有3个控制地址的引脚),此类较多;还有的有地址寄存器。
  严格讲,主机不是向从机发送地址,而是主机往总线上发送地址,所有的从机都能接收到主机发出的地址,然后每个从机都将主机发出的地址与自己的地址比较,如果匹配上了,这个从机就会向主机发出一个响应信号。主机收到响应信号后,开始向总线上发送数据,与这个从机的通讯就建立起来了。如果主机没有收到响应信号,则表示寻址失败。
  比如带IIC的单片机,会有地址寄存器,寄存器里的值即为它作为从机时的地址。
  最常见的情况,主从器件的角色是确定的,也就是说从机一直工作在从机模式。它的地址确定方法我已经说过了。不同的器件定义地址的方式是不同的,有的是软件定义,有的是硬件定义。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-01-29

    建议使用示波器查看一下SCL及SDA的波形是否正常。

    注意一下iic通信中的延时,这个可以结合第一点的波形来查看。

iic作为主机使用,在stm32上应用已经很广泛了。

第2个回答  2019-04-17
1、确定硬件问题还是软件问题;
1.1、找一个IO测试程序,检查IO口是否存在虚焊问题;(IO口程序做跳变,然后用示波器测量IO口);
1.2、找一个IIC的软件驱动,用示波器检测波形是否对?(如果不是,那么证明你的STM32里面的ICC对应的寄存器坏了,此时你换CPU吧)
1.3、如果以上的两种情况都排除了,那么检查你的模块是否好的,最简单的方式就是拿一个新的跟你现在手上的分别用可调电源上电,如果两个模块电流一样,那么模块没坏;
1.4、如果以上情况都排除了,那么检查你的模块外围电路是否可用的,至于这个外围电路,那得你自己去调试;
2、软件问题;
以上问题都排除了,那么请你看看你现在手上的程序那里有问题吧;
PS:个人建议,也是刚上手STM32,互相学习~~~~
第3个回答  2019-01-29
C/C++ code
//iic.h

//for EEPROM

#ifndef _IIC_H_
#define _IIC_H_

#include "macro.h"
#include <stdint.h>
#include "DrvGPIO.h"
#include <stdlib.h>

//定义页长度
#define PAGELEN 32

//定义地址位数,如果是16位地址,移除下面定义
//#define ADDRESS_8BITS

#define SDA1 E_GPA,10
#define SCL1 E_GPA,11

void delay(void);
void delay_ms(unsigned long ms);
void I2C_Start();
void I2C_Stop();
bool Test_Ack();
void SendData(uint8_t buffer);

bool I2C_WriteNByte(uint8_t sla,uint16_t addr,uint8_t *s,uint16_t n);
bool I2C_ReadNByte(uint8_t sla,uint16_t addr,uint8_t *p,uint16_t n);
bool ReadPByte(uint8_t sla,uint16_t addr,uint8_t *p,uint16_t n);
bool WritePByte(uint8_t sla,uint16_t addr,uint8_t *p,uint16_t n);
uint32_t geteepsize(void);

#endif

C/C++ code
//FileName:
//Device:
//Interface:
//BaseFile:
//Description: HY3116的驱动(iic接口)

#include "iic.h"
#include "global.h"

#define _nop_() __NOP()

void SDA_H(void)
{
DrvGPIO_SetBit(SDA1);
}
void SDA_L(void)
{
DrvGPIO_ClrBit(SDA1);
}
void SCL_H(void)
{
DrvGPI追问

有iS-MM-VOCs-4的IIC程序吗?

相似回答