诺基亚5110 LCD初始化问题

时间:2015-11-14 06:56:45

标签: beagleboneblack spi lcd

我正在尝试通过SPI协议将诺基亚5110 LCD连接到BeagleBone Black Rev-C。

连接完全如以下第6页所示: Nokia5110-BeagleBone Black Connections

我为飞利浦PCD8544(诺基亚3310)驱动程序写了一个等效的Arduino代码。 我在哪里导出所需的GPIO端口并通过SPI接口发送命令和数据。

我成功安装并运行了Adafruit的python库: Adafruit Nokia LCD

我的问题是

我有一个奇怪的问题,当我首先运行这个python代码然后我的C代码时,代码运行完美! 但是如果我在python代码之前运行我的C代码,我就得不到输出。逻辑说蟒蛇 代码必须初始化我在代码中缺少的东西。

以下是我初始化LCD的方法:

    fd_spi_dev = open(device, O_RDWR);
//set mode
mode = SPI_MODE_0;
ioctl(fd_spi_dev, SPI_IOC_WR_MODE, &mode);
ioctl(fd_spi_dev, SPI_IOC_RD_MODE, &mode);
//set max bitrate
speed = 4000000;
ioctl(fd_spi_dev, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
ioctl(fd_spi_dev, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
// set an msb first
lsbsetting = 0;
ioctl(fd_spi_dev, SPI_IOC_WR_LSB_FIRST, &lsbsetting);
// set bits per word
bits = 8;
ioctl(fd_spi_dev, SPI_IOC_WR_BITS_PER_WORD, &bits);
ioctl(fd_spi_dev, SPI_IOC_RD_BITS_PER_WORD, &bits);

lcd_write_cmd(0x21);    // LCD extended commands
lcd_write_cmd(0xB8);    // set LCD Vop (contrast)
lcd_write_cmd(0x04);    // set temp coefficient
lcd_write_cmd(0x14);    // set biad mode 1:40
lcd_write_cmd(0x20);    // LCD basic commands
lcd_write_cmd(0x09);    // LCD all segments on
/* I am expecting to see all segments lit here */
sleep(5);
lcd_write_cmd(0x0C);    // LCD normal video 

void lcd_write_cmd(uint8_t cmd) {
    uint8_t *tx = &cmd;
    uint8_t rx;
    uint32_t len = 1;

    struct spi_ioc_transfer tr = {
       .tx_buf = (uint32_t)tx,
       .rx_buf = (uint32_t)&rx,
       .len = len,
       .delay_usecs = delay,
       .speed_hz = speed,
       .bits_per_word = bits,
       .cs_change = 1,
    };

   size = write(fd_dc_val, "0", 1);
   size = write(fd_cs_val, "0", 1);

   ioctl(fd_spi_dev, SPI_IOC_MESSAGE(1), &tr);

   write(fd_cs_val, "1", 1);
}

我是嵌入式编程的新手。我非常感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

如果您没有错过初始化步骤(我没有检查过您的5110数据表),那么您的ioctl或计时问题必定是错误的。

您可以尝试使用抽象ioctl调用的库来排除(我偏爱自己的https://github.com/graycatlabs/serbus;)。

如果它仍然不起作用,那么我会说这可能是一个时间问题 - 在文件I / O方面Python比C慢很多,所以可能没有给LCD驱动程序足够的时间在一些命令之后更新 - 检查数据表,看看是否需要你在任何命令后给它一些时间。