STM32IIC接收到的数据都是0x40怎么办
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32IIC接收到的数据都是0x40怎么办相关的知识,希望对你有一定的参考价值。
STM32F103VET6_IIC接收到的数据都是0x40怎么办
是和iS-AQM-D-1空气质量传感器通信的
有的在出厂时地址就设置好了,用户不可以更改,有的确定了几位,剩下几位由硬件确定(比如有三位由用户确定,就留有3个控制地址的引脚),此类较多;还有的有地址寄存器。
严格讲,主机不是向从机发送地址,而是主机往总线上发送地址,所有的从机都能接收到主机发出的地址,然后每个从机都将主机发出的地址与自己的地址比较,如果匹配上了,这个从机就会向主机发出一个响应信号。主机收到响应信号后,开始向总线上发送数据,与这个从机的通讯就建立起来了。如果主机没有收到响应信号,则表示寻址失败。
比如带IIC的单片机,会有地址寄存器,寄存器里的值即为它作为从机时的地址。
最常见的情况,主从器件的角色是确定的,也就是说从机一直工作在从机模式。它的地址确定方法我已经说过了。不同的器件定义地址的方式是不同的,有的是软件定义,有的是硬件定义。 参考技术A
建议使用示波器查看一下SCL及SDA的波形是否正常。
注意一下iic通信中的延时,这个可以结合第一点的波形来查看。
iic作为主机使用,在stm32上应用已经很广泛了。
参考技术B 1、确定硬件问题还是软件问题;1.1、找一个IO测试程序,检查IO口是否存在虚焊问题;(IO口程序做跳变,然后用示波器测量IO口);
1.2、找一个IIC的软件驱动,用示波器检测波形是否对?(如果不是,那么证明你的STM32里面的ICC对应的寄存器坏了,此时你换CPU吧)
1.3、如果以上的两种情况都排除了,那么检查你的模块是否好的,最简单的方式就是拿一个新的跟你现在手上的分别用可调电源上电,如果两个模块电流一样,那么模块没坏;
1.4、如果以上情况都排除了,那么检查你的模块外围电路是否可用的,至于这个外围电路,那得你自己去调试;
2、软件问题;
以上问题都排除了,那么请你看看你现在手上的程序那里有问题吧;
PS:个人建议,也是刚上手STM32,互相学习~~~~ 参考技术C 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程序吗?
以上是关于STM32IIC接收到的数据都是0x40怎么办的主要内容,如果未能解决你的问题,请参考以下文章