如何解决STM32F407 LIS3DSH 传感器通过 I2C 协议
**我曾尝试使用 I2C 协议使用 LIS3DSH 传感器。我在STM32f手册上应用了程序。但它没有用。我只想接收 x 轴值。据此,GPIOD-12 小于 20 将开启。也许我无法意识到它的失败。有人帮我吗? 提前,谢谢。
#include "stm32f4xx.h" // Device header
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#define SLAVE_ADRESS 0x1D // LIS3DSH ADRESS
/*Prototype Functions*/
void I2C_START(I2C_TypeDef* I2Cx,uint8_t adress,uint8_t direction);
void I2C_WRITE(I2C_TypeDef* I2Cx,uint8_t data);
void I2C_STOP(I2C_TypeDef* I2Cx);
uint8_t I2C_READ_NACK(I2C_TypeDef* I2Cx);
// Valuables
int8_t x=0,y=0,z=0;
int main()
{
// Definitions
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
// Clock Buses Configurations
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD |RCC_AHB1Periph_GPIOB,ENABLE );
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //SEL PIN ON LIS3DSH
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_I2C1); // SCL
GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_I2C1); // SDA
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_ClockSpeed = 100000;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Disable;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_Init(I2C1,&I2C_InitStructure);
I2C_Cmd(I2C1,ENABLE);
GPIO_SetBits(GPIOE,GPIO_PinSource3); //SEL PIN ON LIS3DSH
// 100 HZ 9.2 G LIS3DSH SENSOR.
I2C_START(I2C1,SLAVE_ADRESS<<1,I2C_Direction_Transmitter);
I2C_WRITE(I2C1,0x20);
I2C_WRITE(I2C1,0x67);
I2C_STOP(I2C1);
while(1)
{
// X OUTPUT_L
I2C_START(I2C1,I2C_Direction_Transmitter);
I2C_WRITE(I2C1,0x28);
I2C_STOP(I2C1);
// X OUTPUT_L
I2C_START(I2C1,I2C_Direction_Receiver);
x = I2C_READ_NACK(I2C1);
if(x>20) GPIO_SetBits(GPIOD,GPIO_PinSource12);
}
}
void I2C_START(I2C_TypeDef* I2Cx,uint8_t direction)
{
while(I2C_GetFlagStatus(I2Cx,I2C_FLAG_BUSY));
I2C_GenerateSTART(I2Cx,ENABLE);
while(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_MODE_SELECT)); // EVENT 5 :
I2C_Send7bitAddress(I2Cx,adress,direction);
// EVENT 6 : ADDR BITI 1
if(direction == I2C_Direction_Transmitter)
while(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
else if(direction == I2C_Direction_Receiver)
while(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
}
void I2C_WRITE(I2C_TypeDef* I2Cx,uint8_t data)
{
// EVENT 8.1 :
//while(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_TRANSMITTING));
I2C_SendData(I2Cx,data);
// EVENT 8 :
while(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
}
uint8_t I2C_READ_NACK(I2C_TypeDef* I2Cx)
{
I2C_AcknowledgeConfig(I2C1,DISABLE);
I2C_GenerateSTOP(I2Cx,ENABLE);
// EVENT 7 :
while(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_RECEIVED));
return I2C_ReceiveData(I2Cx);
}
void I2C_STOP(I2C_TypeDef* I2Cx)
{
I2C_GenerateSTOP(I2Cx,ENABLE);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。