結構前日までは、スムーズに進んだのですが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, ®, 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);
}
}