首页 > 解决方案 > 如何使用 SAM4S 从 MPU6050 读取数据

问题描述

我正在尝试使用带有 ATSAM4SD32C 微控制器的 SAM4S-EK2 开发板从 MPU6050 传感器读取信息,在板载 LCD 显示屏上显示数据。但是,当我尝试读取数据时,LCD 中显示的接收值始终相同。

我究竟做错了什么?

我正在使用带有 ASF 版本 3.32.0 的 Atmel Studio 7

这是我当前的代码:

#include <asf.h>

#define TWI_CLK 200000
#define ADDRESS 0x68
#define READ    0x3b

#define ILI93XX_LCD_CS      1

twi_options_t opt;
struct ili93xx_opt_t g_ili93xx_display_opt;

void configure_lcd()
{
    /** Enable peripheral clock */
    pmc_enable_periph_clk(ID_SMC);

    /** Configure SMC interface for Lcd */
    smc_set_setup_timing(SMC, ILI93XX_LCD_CS, SMC_SETUP_NWE_SETUP(2)
    | SMC_SETUP_NCS_WR_SETUP(2)
    | SMC_SETUP_NRD_SETUP(2)
    | SMC_SETUP_NCS_RD_SETUP(2));

    smc_set_pulse_timing(SMC, ILI93XX_LCD_CS, SMC_PULSE_NWE_PULSE(4)
    | SMC_PULSE_NCS_WR_PULSE(4)
    | SMC_PULSE_NRD_PULSE(10)
    | SMC_PULSE_NCS_RD_PULSE(10));

    smc_set_cycle_timing(SMC, ILI93XX_LCD_CS, SMC_CYCLE_NWE_CYCLE(10)
    | SMC_CYCLE_NRD_CYCLE(22));

    smc_set_mode(SMC, ILI93XX_LCD_CS, SMC_MODE_READ_MODE
    | SMC_MODE_WRITE_MODE);

    /** Initialize display parameter */
    g_ili93xx_display_opt.ul_width = ILI93XX_LCD_WIDTH;
    g_ili93xx_display_opt.ul_height = ILI93XX_LCD_HEIGHT;
    g_ili93xx_display_opt.foreground_color = COLOR_BLACK;
    g_ili93xx_display_opt.background_color = COLOR_WHITE;

    /** Switch off backlight */
    aat31xx_disable_backlight();

    /** Initialize LCD */
    ili93xx_init(&g_ili93xx_display_opt);

    /** Set backlight level */
    aat31xx_set_backlight(AAT31XX_AVG_BACKLIGHT_LEVEL);

    ili93xx_set_foreground_color(COLOR_WHITE);
    ili93xx_draw_filled_rectangle(0, 0, ILI93XX_LCD_WIDTH,
    ILI93XX_LCD_HEIGHT);
    /** Turn on LCD */
    ili93xx_display_on();
    ili93xx_set_cursor_position(0, 0);
}

int main (void)
{
    sysclk_init();
    board_init();
    configure_lcd();

    pio_configure(PIOB, PIO_PERIPH_B, (PIO_PB5A_TWCK1 | PIO_PB4A_TWD1), PIO_OPENDRAIN);

    pmc_enable_periph_clk(ID_TWI1);

    opt.master_clk = sysclk_get_peripheral_hz();
    opt.speed      = TWI_CLK;
    twi_enable_master_mode(TWI1);
    twi_master_init(TWI1, &opt);

    twi_packet_t    packet;
    uint8_t answer[20];

    answer[0]=0x00;

    //pacote.addr[0] = 0x6b;
    //pacote.addr_length = 1;
    //pacote.buffer = &resposta;
    //pacote.chip = ENDERECO_SENSOR;
    //pacote.length = 1;
    //
    //if(twi_master_write(TWI1, &pacote) == TWI_SUCCESS)
    //{
    //ili93xx_set_foreground_color(COLOR_WHITE);
    //ili93xx_draw_filled_rectangle(0, 0, 200, 200);
    //ili93xx_set_foreground_color(COLOR_BLACK);
    //ili93xx_draw_string(0, 0, "Enviou");
    //}

    while(1)
    {
        packet.addr[0] = READ;
        packet.addr_length = 1;
        packet.buffer = &answer;
        packet.chip = ADDRESS;
        packet.length = 14;

        twi_master_read(TWI1, &packet);

        char    a[20];
        int16_t b;
        b = (answer[2] << 8 | answer[3]);
        sprintf(a,"%i",b);
        ili93xx_set_foreground_color(COLOR_WHITE);
        ili93xx_draw_filled_rectangle(95, 175, 240, 200);
        ili93xx_set_foreground_color(COLOR_BLACK);
        ili93xx_draw_string(100, 180, a);
        delay_ms(100);
    }
}

标签: cmicrocontrolleratmel

解决方案


推荐阅读