2015-11-14 97 views
0

我想通过SPI协议将诺基亚5110 LCD连接到BeagleBone Black Rev-C。诺基亚5110 LCD初始化问题

的连接完全一样的6页上显示: Nokia5110-BeagleBone Black Connections

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

我成功安装并运行Adafruit的的蟒蛇库: Adafruit Nokia LCD

我的问题是

我有一个奇怪的问题,当我第一次,然后运行这个Python代码我的C代码,代码工作完美! 但是,如果我在python代码之前运行我的C代码,我没有输出。逻辑说,python 代码必须初始化我在我的代码中缺少的东西。

下面是如何初始化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); 
} 

我在嵌入式编程新手。我将不胜感激任何帮助。谢谢。

回答

0

如果您不缺少初始化步骤(并且我没有在5110数据表中检查过),它必须是您的ioctls出现问题或者计时问题。

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

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