读取一个字(2个字节)而不提供用户空间的寄存器地址
我正在尝试读取来自用户空间C的I2C环境光传感器BH1750.我正在使用带有Linux的Beaglebone口袋. 数据表明,在测量操作后,需要使用以下I2C序列读取结果:S Adr Rd (A) (Data) A (Data) NA P. 我遇到的问题:我发现的所有示例/命令都只读取1个字节,或者需要寄存器地址才能阅读更多. 我发现的最接近的是以下命令:i2c_master_recv(). 但是,我对文档的解释是该命令用于内核 - 设备驱动程序. 如何从用户空间发出这样的I2C阅读序列? 解决方案 我能够使用伊恩·阿伯特(Ian Abbott)的评论来解决它: 假设I2C控制器已打开,并且I2C_SLAVE IOCTL命令已用于设置ADR,则具有2个长度的读取SYSCALL将执行上述I2C读取交易. - 伊恩·雅培 10月4日,13:45 这是由此产生的I2C通信的逻辑分析仪 -
8 2024-04-10
编程技术问答社区
将ssd1306与stm32f103连接到寄存器上,i2c '数据模式'不工作。
我想制作第一个在STM32上使用I2C的应用程序,以与SSD1306一起使用. "命令模式"中的所有通信都在起作用,并且显示1个字节命令的display反应.我认为当一个包装中的字节数增加时,问题处于"数据模式". . 基本功能以I2C 发送数据 void i2c1_send(uint8_t address, uint8_t *command, uint16_t length) { while(I2C1->SR2 & I2C_SR2_BUSY); I2C1->CR1 |= I2C_CR1_START; while(!(I2C1->SR1 & I2C_SR1_SB)); I2C1->DR=address; //7 bit address in this byte is already shifted left by one while(!(I2C1->SR1 & I2C_SR1_ADDR)|!(I2C1->
6 2024-04-09
编程技术问答社区
Write()ing to i2c device: 操作不允许
因此,我有2个PCA9555(16通道数字I/O)芯片连接到通过I2C运行Linux的小型嵌入式设备. PCA9555设备有7位地址0100000和0100001. 当我为板上电源时,我运行: # modprobe i2c-i801 # modprobe i2c-dev # i2cdetect -l i2c-0 smbus SMBus I801 adapter at 0500 SMBus adapter # i2cdump -y -r 0 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- ... (Same for every line) 70: -- -- -- -- -- -- -- # dmesg|tail i801_smbus 0000:00:1f.3 Transaction timeout ...
8 2024-04-09
编程技术问答社区
整合3轴陀螺仪的读数?
因此,我已经在C中编写了一个程序,以非常高的数据速率打印3轴陀螺的值.这些值是角速的瞬时值,如果设备仍在,则在运动上会上升并下降.我需要它保持高值并在返回位置时恢复到零. 如果我在固定的样本时间内整合了值,我可以实现吗?我该如何集成?我是C编程的初学者. 谢谢你 解决方案 首先,您需要了解数字陀螺仪的物理方面:suffers from drift(它不会返回到0,但通常会在很长一段时间内发生),并且同样重要的是,通常是biased;这是一个校准问题. 陀螺偏差可以通过在其静止时读取其轴值来观察.如果它读取0以外的其他内容,那就是您的偏见.您需要弥补这一点.你怎么做呢? - 校准 陀螺仪校准:在给定时间段内读取轴值(1000个样本应该这样做).平均样品获得偏差值. You have to subtract this bias value from all readings when running you code to get a valid reading.如果您在
10 2024-04-09
编程技术问答社区
读取MCP9800的C i2c芯片突然开始失效
我有一些代码: #define AMB_LSB 0.0625 void Ambient::read() { uint32_t raw; float filtered; uint8_t bytes = 2; uint8_t buf[bytes]; if(i2c_smbus_read_i2c_block_data(i2c_bus_address, A_TEMP_REG, bytes, buf) > 4; filtered = filter.execfilter( raw );
2 2024-04-09
编程技术问答社区
STM32F207 I2C测试失败
我正在学习使用STM32F207微控制器在STM3220G板上学习嵌入式开发.我试图通过在同一芯片上连接两个I2C2和I2C3模块并发送/接收字符来测试I2C接口.这是我当前编写的代码(使用MDK-ARM 5): #include volatile uint8_t data = 'a', recv = 'x'; void i2c_init(void); void I2C2_EV_IRQHandler(void) { volatile uint16_t stat, dummy; stat = I2C2->SR1; switch(stat) { // SB set; read SR1 and write slave address in DR to clear case 0x01: dummy = I2C2->SR1; // Send add
14 2024-04-09
编程技术问答社区
如何转换从温度传感器得到的数值?
我正在使用ST Temperature sensor( hts221 ),我使用I2C命令通信与传感器. 我从文档中看到如下文本. enter code here Temperature data are expressed as TEMP_OUT_H & TEMP_OUT_L as 2’s complement numbers. 和以下图片是文档的描述. 和Temperature data从传感器中读取就像以下 TEMP_OUT_L is 0xA8 TEMP_OUT_H is 0xFF 如何将temp_out_l和temp_out_h的值转换为温度数据? 预先感谢? 解决方案 通过在两个值中加入位,形成一个16位值: const temp_h = i2c_read_byte(TEMP_OUT_H); const temp_l = i2c_read_byte(TEMP_OUT_L); const uint16_t temp = (te
8 2024-04-09
编程技术问答社区
读取时未返回写入I2C的缓冲区
我正在尝试从I2C总线上的内存位置读取一个值.当我在终端运行时,我会变得奇怪. 这是我的程序 #include #include #include #include #include #include #include #include #include #include #include #include #define I2C_ADAPTER "/dev/i2c-0" #define I2C_DEVICE 0x00 int main (int argc,
10 2024-04-08
编程技术问答社区
为什么I2C_SMBUS_BLOCK_MAX被限制为32字节?
我正在尝试通过I2C总线配置SAA6752HS芯片(MPEG-2编码器),使用Raspberry Pi作为开发套件.这是一块小菜一碟,直到我不得不在芯片的地址0xc2上写作.对于此任务,我必须使用一个I2C命令,该命令期望有效载荷189个字节.因此,我偶然发现了I2C驱动程序内部的32个字节限制,该驱动程序由I2C_SMBUS_BLOCK_MAX定义,在/usr/include/linux/i2c.h中.不可能强制不同的最大限制值. i2c lib周围的所有内容最终都进入了i2C_SMBUS_ACCESS的函数,并且任何32个字节的请求都使IOCTL返回-1.我不知道该如何调试到目前为止. static inline __s32 i2c_smbus_access(int file, char read_write, __u8 command, int size, union i2c_smbus_data *d
6 2024-04-08
编程技术问答社区
如何使用HAL锁定和解锁功能,为什么?
我正在尝试了解由另一个程序员编写的代码.它使用i²c通信以在STM32 Microcontroller的EEPROM上写入数据./p> 通常,我了解他的代码的工作原理,但我不明白他为什么使用HAL_LOCK和HAL_UNLOCK函数. 这些是这些方法的代码: typedef enum { HAL_UNLOCKED = 0x00U, HAL_LOCKED = 0x01U } HAL_LockTypeDef; #if (USE_RTOS == 1) /* Reserved for future use */ #error "USE_RTOS should be 0 in the current HAL release" #else #define __HAL_LOCK(__HANDLE__) \ do{ \
10 2024-04-08
编程技术问答社区
通过Linux通过I2C阅读和写作EEPROM
我试图读写 atter 24c256 Eeprom i2c,但是我很难做到这一切. 这是我到目前为止的代码: #include #include #include #include #include #include #include #include #include #include #include #define DEVICE_PATH "/dev/i2c-1" #define PAGE_SIZE 64 #define DEVICE_ADDR 0x50 // 0b1010xxxx int file_desc; char buffer[PAGE_SIZE + 2]; // 64 bytes +
10 2024-04-08
编程技术问答社区
为什么i2c_smbus功能不可用?(I2C - 嵌入式Linux)
在开发嵌入的Linux软件以在I2C总线上进行通信时,有许多参考文献涉及使用 i2c_smbus _ 功能.当 i2c_smbus 函数(例如 i2c_smbus_read_word_word_data )在软件项目中引用了ARM8处理器错误的软件项目,例如' i2c_smbus_read_rad_word_word_word_word_words'在此范围中未声明编译. 对以下标头文件的调查表明,大多数 i2c_smbus 函数定义不存在. /usr/arm-linux-gnueabi/include/linux/i2c.h /usr/arm-linux-gnueabi/include/linux/i2c-dev.h 也是以下参考如何解决此问题? 研究参考 使用linux in linux i2c i2c linux userspace的i2c通信 - 第二部分 i2c dev dev Interface 解决方案 因为您正在为应用程序使用错
6 2024-04-08
编程技术问答社区
是否可以使用具有重复启动条件的STM32F4上的MLX90395磁力计在I2C通信中使用HAL功能?
我目前正在尝试使用I2C协议使用STM32F446RE微控制器对磁力计MLX90395进行编程. 我正在利用HAL函数(Master_transmit/rececre,mem_write/read),并且我看到他们总是在初始2个字节之后放置停止条件(deviceaddress并注册). . 在传感器的数据表中,明确提到需要重复启动,因为停止条件可以效应,例如寄存器值,传感器状态等 我查看了此磁力计的演示Arduino草图,它确实使用了重复的开始. 是否有解决方案或解决方法? 我尝试在主函数和成员功能之间进行更改,但没有见证任何变化.相同的功能,但是_it()可能是一个选择,但我不完全理解他们的工作方式. 这是一个示例函数,将IC置于单个测量模式: enumExit Enter_SM_Mode(uint8_t address, uint8_t cmd_reg){ HAL_StatusTypeDef ret; //-----
12 2024-04-07
编程技术问答社区
尽管在Linux内核模块中存在EXPORT_SYMBOL,如何防止 "error: 'symbol' undeclared here"?
当我收到此错误时,我将一些驱动程序嵌入到Linux内核中(我正在董事会文件中添加设备并注册它): error: 'kxtf9_get_slave_descr' undeclared here (not in a function) i在驱动程序文件中找到上方的功能 struct ext_slave_descr *kxtf9_get_slave_descr(void) { return &kxtf9_descr; } EXPORT_SYMBOL(kxtf9_get_slave_descr); 是否应该通过export_symbol"可见"吗? 包含上面代码的c文件没有标头文件(我没有编写,我只是找到了完美编译代码的其余部分(因此,它在文件夹中"看到"代码),以及包含上面代码的文件也编译了! 解决方案 EXPORT_SYMBOL导出动态链接的符号.您所拥有的不是链接错误,而是由于缺少函数声明而导致的汇编错误.您必须为C文件编写标头文件并包括该标头文件,或者
6 2024-04-07
编程技术问答社区
I2C设备linux驱动
如何为I2C设备制作字符设备,并具有开放,关闭,IOCTL等.功能?我一直在寻找有关它的信息,最后两个星期,找不到任何可行的信息.我在Essential Linux设备驱动程序中找到了一些信息,但是它是为2.6内核编写的,我使用3.4.79(我试图在库比亚式的cubian inters上为cubieboard2编写此驱动程序),所以这本书具有许多弃用功能,我试图尝试像那里一样写我的驱动程序,但它仍然不起作用(当我涉足猫角色设备时,给我内核错误).谁能向我解释该怎么办,或者至少给我一个工作的例子. 所以,有我的代码: http://pastebin.com/t7pbtpym 我只是尝试使i2c巴士起作用,但是在示波器上,我在I2C线上看不到任何东西,而编译时我没有错误.另外,我找不到如何将设备驱动程序连接到I2C总线号.因为我的cubieboard2上有4辆I2C总线,例如如何将设备驱动器连接到I2C-1总线? 解决方案 谢谢,伙计们.我已经找到了几个小时前想要的东西.
6 2024-04-06
编程技术问答社区
如何使用文件描述符来冲刷写操作?
事实证明,对open()vess fopen()()的整个误解源于Linux 2.6.14内核中的buggy I2C驱动程序.向后竞争,一个工作的驱动器驱动程序解决了我要在这里解决问题的根本原因. 我试图找出Linux(I2C)中串行设备驱动程序的问题.看来,通过在设备上的写入和读取之间添加定时的OS停顿(睡觉),事物的工作正常……好多了. 旁边: i2c的性质是,大师读取或写的每个字节都被电线的另一端所承认或异步工作 - 我无法与公共汽车的工作原理进行调和. Anyhoo ... 我想要 flush 写信确保(而不是使用固定持续时间), 或 以某种方式测试写入/阅读交易以多线友好方式完成. 使用fflush(fd);的麻烦是,它要求'fd'是流指针(不是文件描述符),即. FILE * fd = fopen("filename","r+"); ... // do read and writes fflush(fd); 我的问题是我需要使用ioctl()
24 2024-04-06
编程技术问答社区
AVR I2C故障
我正在尝试使用I2C与AT90CAN128进行通信,但是它并没有比循环时的关注: while(!(TWCR & (1
10 2024-03-21
编程技术问答社区
为什么我只收到第一个地址字节? (I2C协议)
期望从属能够确认和返回数据,但事实并非如此. 这是我的协议. 数据表提到"从第一个以MSB发送字节来回答.字节0和BYTE1包含 预测值.所有字节均由大师承认." 编辑: 源库 也只有我在Arduino Fio上,但我没有继承Arduino库. #include #include #include #include #include #define LED PB5 #define I2C_READ 0x5A char buffer[1]; //char data[9]; uint16_t val = 0; uint8_t status = 0; void getVal() { if(i2c_start(I2C_READ)) { uart_puts("Start "); val = ((
12 2024-03-21
编程技术问答社区
如何正确初始化I2C stm32?
我想从ADXL345加速度计获取数据,但似乎我将其连接不正确. scl- pc6(带有10k电阻器) SDA-PC7(带有10K电阻器) sdo- gnd CS -VCC gnd -gnd 3.3V -VCC 这是我的代码: void I2CG_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStructure; RCC_AHBPeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // I2CG clock enable RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2CG, ENABLE); RCC_
8 2024-03-03
编程技术问答社区
Linux内核中的I2C写确认轮询
这里的平淡无奇的回应使我感到奇怪 this . 我已经被设备所困扰 在内部[EEPROM]写周期期间禁用I2C接口. 这似乎不公平,就像" 我现在下去沙发"中,所以不要使用它一段时间,因为我让一个座椅垫子里撕裂".老实说,为什么这是我的问题? 无论如何,数据表建议确认投票是答案 - 输入Linux内核... Linux GPIO位bashed I2C驱动程序是否提供了这样做的机制?实质上是发送地址写入位设置并继续这样做,直到出现ACK为止. 我在手臂上使用2.6.14,带有后部移植的GPIO位bashing驱动器(我认为来自2.6.19). 解决方案 它似乎不太脱离架子,但是 您可能需要查看拥有一个协议修改标志,例如标志I2C_M_NOSTART 在您的补丁中只有不同. 至少有一种方法可以做(诚然是一种混乱的方式) 我希望您的缘故您无需在同一巴士上放置普通的I2C设备. 老实说,硬件供应商一直在做类似的事情.他们认为问题"已解决",只要
20 2024-03-03
编程技术问答社区