Как читать данные из MPU6050 с помощью SAM4S - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь прочитать информацию с датчика MPU6050 с помощью платы разработки SAM4S-EK2 с микроконтроллером ATSAM4SD32C, отображая данные на встроенном ЖК-дисплее.Однако, когда я пытаюсь прочитать данные, полученное значение, которое отображается на ЖК-дисплее, всегда одинаково.

Что я делаю не так?

Я использую Atmel Studio 7 с ASF версии 3.32.0

Вот мой текущий код:

#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);
    }
}
...