2022年5月7日土曜日

Raspberry Pi Pico プログラミング事始め。I2Cを使うぞの巻

 結構前日までは、スムーズに進んだのですがI2Cでは色々とハマりました。

AQM1602のLCDを動かそうと思って作業をしましたが、いろいろとハマりようやく表示できました。

動かしたのは秋月のこんなやつ、一番安いやつですね。

はまったポイントはいっぱい。

今日の段階では何とか動いた感じである。

波形が出ているかもわからず。。。

やっぱりオシロ欲しいな。。。

i2c_write_blocking( , , , ,true) だと動かない。。。

i2c_write_blocking(I2C_PORT, addr, buf, 2, false);


#include "pico/stdlib.h"
#include "hardware/i2c.h"

#include <stdio.h>

#define addr 0x3e
#define command 0x00
#define data1 0x40
#define clear 0x01
#define home 0x02
#define display_On 0x0f
#define LCD_2ndline 0x40+0x80
#define READ_BIT 0x80

#define I2C_PORT  i2c1

void init(void) {
   i2c_init(I2C_PORT, 100 * 1000);
    gpio_set_function(26, GPIO_FUNC_I2C);
    gpio_set_function(27, GPIO_FUNC_I2C);
    gpio_pull_up(26);
    gpio_pull_up(27);

}

static void I2C_read_registers(uint8_t reg, uint8_t *buf, uint16_t len) {
    // For this particular device, we send the device the register we want to read
    // first, then subsequently read from the device. The register is auto incrementing
    // so we don't need to keep sending the register we want, just the first.
    reg = reg | READ_BIT;
    i2c_write_blocking(I2C_PORT, addr, &reg, 1, true);
    i2c_read_blocking(I2C_PORT, addr, buf, len, true);
}

static void I2C_write_register(uint8_t reg, uint8_t data) {
    uint8_t buf[2];
    //buf[0] = reg & 0x7f;  // remove read bit as this is a write
    buf[0] = reg;
    buf[1] = data;
    i2c_write_blocking(I2C_PORT, addr, buf, 2, false);
}

int main() {
    stdio_init_all();

    init();

    const uint LED_PIN = 22;
    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT);
    char *b = "apple pen" ;
    int cnt;

   while(true){
   I2C_write_register(command,0x38);
   sleep_ms(1);
   I2C_write_register(command,0x39);
   sleep_ms(1);
   I2C_write_register(command,0x14);
   sleep_ms(1);
   I2C_write_register(command,0x73);
   sleep_ms(1);
   I2C_write_register(command,0x56);
   sleep_ms(1);
   I2C_write_register(command,0x6c);
   sleep_ms(1);
   sleep_ms(1);
   I2C_write_register(command,home);
   sleep_ms(1);
   I2C_write_register(command,clear);
   sleep_ms(1);
   I2C_write_register(command,display_On);
   sleep_ms(1);
   
   for (cnt = 0; *(b + cnt) != '\0'; cnt++) {
       I2C_write_register(data1, *( b + cnt));
       }
   sleep_ms(1000);
   }

}









0 件のコメント:

コメントを投稿