BASIC4MCU | 질문게시판 | stm32f767을 이용해서 자이로가속도 센서의 값 받아오기
페이지 정보
작성자 rlchwjswk 작성일2023-06-03 19:16 조회419회 댓글1건본문
stm32f767을 이용해서 자이로가속도 센서의 값 받아오려고 하는데 계속 안돼서요. 혹시 어디가 문제인지 알 수 있을까요?
#include "stm32f767xx.h"
#include "OK-STM767.h"
#include <stdint.h>
void Initialize_I2C3(void);
void MPU6050_write(U08 address,U08 byte);
unsigned long MPU6050_read(U08 address);
void MPU6050_Init(void);
#define MPU6050_ADDR 0xD0
#define SMPLRT_DIV_REG 0x19
#define GYRO_CONFIG REG 0x1B
#define ACCEL_CONFIG_REG 0x1C
#define ACCEL_XOUT_H_REG 0x3B
#define TEMP_OUT_H_REG 0x41
#define GYRO_XOUT_H_REG 0x43
#define PWR_MGMT_1_REG 0x6B
#define WHO_AM_I_REG 0x75
/* ----- 메인 프로그램 -------------------------------------------------------- */
int main(void)
{
Initialize_MCU();
Delay_ms(50);
Initialize_LCD();
Initialize_TFT_LCD();
GPIOC->MODER &= 0xFFFFFCFF;
GPIOC->MODER |= 0x00000100;
GPIOC->BSRR = 0x00000010;
TFT_string( 2, 5,White,Magenta, " I2C를 사용한 MPU6050 액세스 ");
TFT_string(11,10,White,Black, "어드레스 = 0x0000");
//MPU6050_Init();
while(1){
TFT_string( 2, 5,White,Magenta, " I2C를 사용한 MPU6050 액세스 성공");
}
}
/* ----- 사용자 정의 함수 ----------------------------------------------------- */
void Initialize_I2C3(void)
{
//RCC->APB1ENR |= 0x00800000;
GPIOA->MODER &= 0xFFFCFFFF;
GPIOA->MODER |= 0x00020000;
SYSCFG->PMC &= ~0x00000004;
GPIOC->MODER &= 0XFFF3FFFF;
GPIOC->MODER |= 0X00080000;
GPIOA->OTYPER |= 0x00000100;
GPIOC->OTYPER |= 0x00000200;
GPIOA->OSPEEDR = 0x00000000;
GPIOC->OSPEEDR = 0x00000000;
//GPIOA->PUPDR |= 0x00010000;
//GPIOC->PUPDR |= 0x00040000;
GPIOA->AFR[1] &= 0xFFFFFFF0;
GPIOA->AFR[1] |= 0x00000004;
GPIOC->AFR[1] &= 0xFFFFFF0F;
GPIOC->AFR[1] |= 0x00000040;
I2C3->CR1 = 0x00000000;
I2C3->TIMINGR = 0x00100306;
I2C3->CR1 = 0x00000001;
}
void MPU6050_Init(void)
{
uint8_t check;
uint8_t Data;
check=MPU6050_read(WHO_AM_I_REG);
Beep();
if (check== 104)
{
MPU6050_write(PWR_MGMT_1_REG,0);
Data = 0x07;
MPU6050_write(SMPLRT_DIV_REG,Data);
Data = 0x00;
MPU6050_write(ACCEL_CONFIG_REG,Data);
}
TFT_string(11,10,White,Black, "WAKE_UP_MPU0000");
}
void MPU6050_write(U08 address,U08 byte)
{
I2C3->CR2 = 0x000100D0;
I2C3->CR2 |= 0x00002000;
while(!(I2C3->ISR & 0x00000002));
I2C3->TXDR = address & 0x00FF;
while(!(I2C3->ISR & 0x00000002));
I2C3->TXDR = byte;
while(!(I2C3->ISR & 0x00000040));
I2C3->CR2 |= 0x00004000;
Delay_ms(5);
}
unsigned long MPU6050_read(uint8_t address)
{
unsigned long byte;
I2C3->CR2 = 0x000100D0;
I2C3->CR2 |= 0x00002000;
while(!(I2C3->ISR & 0x00000002));
TFT_string(11,10,White,Black, "어드레스 = 0x1111");
Beep();
I2C3->TXDR = address & 0x00FF;
while(!(I2C3->ISR & 0x00000040));
I2C3->CR2 = 0x000104D0;
I2C3->CR2 |= 0x00002000;
while(!(I2C3->ISR & 0x00000004));
byte = I2C3->RXDR & 0x000000FF;
while(!(I2C3->ISR & 0x00000040));
I2C3->CR2 |= 0x00004000;
Delay_us(10);
return byte;
}
댓글 1
조회수 419master님의 댓글
master 작성일
i2c 초기화 함수 및 6050 초기화 함수를 사용하지 않은 이유가 무엇일까요?
정상동작하는 예제로 회로구성에 문제가 없는지를 먼저 체크하고나서
작성한 코드를 돌리는 것이 좋습니다.
풀업저항을 사용해야하며, 통신속도를 낮추어서 체크하는 것이 좋습니다.