gpt4 book ai didi

c - 用于 OLED 屏幕的 Debian I2C 驱动程序不起作用。 [SSD1306]

转载 作者:行者123 更新时间:2023-11-30 14:58:28 25 4
gpt4 key购买 nike

我有一些驱动程序代码,正在测试它们是否与 SSD1306 驱动的 OLED 屏幕(128x32)(与 OLED adafruit 型号相同)一起使用。我需要它在 debian 中运行(我正在使用 Linario-4.4.9)

我已按照 Debian 指南了解如何开始为设备创建文件处理程序,如下所示。 oled.h 中唯一的内容是设备地址 (0x3C) 和原型(prototype)类型。我遵循了 adafruit github 上采取的初始化方法(因为我首先在 Ardunio 上尝试了他们的代码,以确保屏幕确实工作)。我相信我可能做错了什么,但我不完全确定我做错了什么。我还在下面列出了我的初始化过程。

#include <errno.h>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

#include <linux/i2c-dev.h>

#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ioctl.h>

#include "oled.h"

int oled;

int lcd_driver_init(void)
{
///< Begin the init proc.
int dloc = open("/dev/i2c-1", O_RDWR);
if (dloc < 0 )
{
fprintf(stderr, "Error opening i2c device\n");
return -1;
}


if(ioctl(dloc, I2C_SLAVE, SCR_ADDR) < 0)
{
fprintf(stderr, "Error in ioctl. Errno :%i\n",errno);
return -2;
}

oled = dloc;
fprintf(stderr, "init success, device open and local\n");
return EXIT_SUCCESS;
}

int oled_command( uint8_t cmd)
{
char command[2]= {0};
command[1] = cmd;
int check = (write(oled, command, 2));

return check;
}

void oled_cmd_start()
{
int check = (write(oled, 0x00, sizeof(uint8_t)));
if(check<0)
fprintf(stderr, "Errno set:: %i\n", errno);
return;
}
void oled_data_start()
{
uint8_t _data_start_[1] ={ 0x40 };
int check = (write(oled, _data_start_, sizeof(uint8_t)));
if(check<0)
fprintf(stderr, "Errno set oled_data_start:: %i\n", errno);
return;
}

int oled_data (uint8_t xmit)
{

int check = (write(oled, &xmit, (sizeof(uint8_t))));
if(check<0)
fprintf(stderr, "Errno set oled_data:: %i\n", errno);
return check;
}

初始化进程

void sendcommand(unsigned char payload)
{
oled_data(0x00); //Control Byte - Command
oled_data(payload); //payload
}
void lcd_init(void)
{

sendcommand(0xAE);//--Set Display off

sendcommand(0x00);//--set low column address

sendcommand(0x10);//--set high column address

sendcommand(0x81);//--set contrast control register
sendcommand(0x7f);

sendcommand(0xa1);//--set segment re-map 95 to 0

sendcommand(0xA6);//--set normal display

sendcommand(0xa8);//--set multiplex ratio(1 to 16)
sendcommand(0x1f);//--duty 1/32

sendcommand(0xd3);//--set display offset
sendcommand(0x00);//--not offset

sendcommand(0xd5);//--set display clock divide ratio/oscillator frequency
sendcommand(0xf0);//--set divide ratio

sendcommand(0xd9);//--set pre-charge period
sendcommand(0x22);

sendcommand(0xda);//--set com pins hardware configuration
sendcommand(0x02);//disable left/right remap and set for sequential

sendcommand(0xdb);//--set vcomh
sendcommand(0x49);//--0.83*vref

sendcommand(0x8d);//--set DC-DC enable
sendcommand(0x14);//

sendcommand(0xAF);//--turn on oled panel

sendcommand(0xA4);//--Entire Display ON

}

接下来,我发送交替的 0xFF 来尝试在屏幕上制作条纹。唯一显示的是随机像素。没有连贯性。

我已连接逻辑分析仪来嗅探 I2C 线路,当我连接 LA 时,I2C 线路似乎不再起作用,并且 ERRNO 返回 IO 故障 (#5)。然而,打开设备来获取文件指针似乎从来没有出现过问题。

有时我确实会收到 ERRNO 作为超时,但我读到这只是使用协议(protocol)的 I2C 设备的问题,因为 write 期望比 I2C 更快的响应给。

我还使用 -std=c99 -O0 进行编译,以确保所有内联函数都存在,并确保循环变量可用。

如果有人能指出我正确的方向或指出我的方法中的一些缺陷,我将不胜感激。谢谢。

编辑

我检查了设备树并且 i2c 设备已正确启用。然而,i2c_freq 速度似乎均未启用。这是否会导致超时和垃圾数据传输?

最佳答案

I have connected a logic analyzer to sniff the I2C lines, and it appears that when I have the LA connected, the I2C lines no longer function and ERRNO returns an IO fault (#5).

逻辑分析仪只是一种测量设备。它将捕获的数据转换为时序图,解码您设置的协议(protocol)。因此,它不会对任何 I2C 读写错误负责(直到您的接地和硬件连接正确)。

对于超时问题,您可以尝试降低i2c时钟频率或ioctl I2C_TIMEOUT

关于c - 用于 OLED 屏幕的 Debian I2C 驱动程序不起作用。 [SSD1306],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43333649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com