我正在尝试通过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);
}
我是嵌入式编程的新手。我非常感谢任何帮助。谢谢。
答案 0 :(得分:0)
如果您没有错过初始化步骤(我没有检查过您的5110数据表),那么您的ioctl或计时问题必定是错误的。
您可以尝试使用抽象ioctl调用的库来排除(我偏爱自己的https://github.com/graycatlabs/serbus;)。
如果它仍然不起作用,那么我会说这可能是一个时间问题 - 在文件I / O方面Python比C慢很多,所以可能没有给LCD驱动程序足够的时间在一些命令之后更新 - 检查数据表,看看是否需要你在任何命令后给它一些时间。