I2C是双线串行总线。它用于与嵌入式系统和计算机主板中的低速外设接口。
我有一个正在开发的定制 SOM(基于 iMX6)板,它将运行 Ubuntu,并且有多个 I2C 设备连接到其中一个 iMX6 I2C“适配器”。鉴于硬件尚未可用...
我和我的伙伴目前正在为 PIC16F877A 微控制器和 LCD1602 I2C 屏幕构建接口代码集 我们可以完美地登机,但屏幕上没有显示任何内容......
Arduino ESP32 I2C 我可以为SLAVE(客户端)设置自定义引脚吗
是否可以在Arduino环境中为I2C从机(客户端、外设)设置自定义引脚? 语境: 在 ESP32(来自 Freenove 的 ESP32-WROVER)上,我尝试与 2 个设备通信...
我正在尝试使用i2c工具来读写I2C设备。 i2cset块写入似乎不起作用。我收到“错误:参数太多!” 字节和字写入可以工作。 到底是什么意思...
如何重置Giantec GT24C64A EEPROM中的内部地址计数器?
我正在尝试使用 i2cgert (或 i2ctransfer)从 eeprom 中读取数据,但我无法重置 eeprom 的内部地址计数器。因此,我每次读取相同偏移量的不同值。 为了考试...
BH1750 I2C Python 在 Raspberry Pi 上失败
我刚刚为我的 Raspberry Pi 4 项目购买了 BH1750 勒克斯探测器。这段代码的工作原理: 进口板 导入时间 导入 adafruit_bh1750 i2c = 板.I2C() 传感器 = adafruit_bh1750.BH1750(i2c) 而 Tr...
我使用stm32f103c8t6 bluepill开发板。我在 STM32CubeIDE 中启用了 I2C-2。默认情况下,scl 引脚分配给 PB10,sda 引脚分配给 PB11。但我需要将它们切换为 SCL PB11、SD...
现在我有两个stm32芯片,两个stm32的I2C连接同一个设备,一个stm32用于向设备发送数据,也用于接收数据;另一个stm32只接收de返回的数据...
我有点绝望,我试图通过带有 HD44780 和 I2C 芯片的 Raspberry pi 显示当前时间。这效果很好,但现在我希望背光保持关闭状态。
在Rust中使用sh1106(和类似的)时,有没有办法不“移动”i2c
我对 Rust 还很陌生,正在深入研究相对复杂的嵌入式编程,也许这就是我的问题,请耐心等待... 我使用 RPi Pico,带有基于 i2c 的 SH11106 显示屏,我们...
我正在尝试学习如何使用组件的数据表编写驱动程序。本例中使用 MB85RC16 FRAM。数据表 = https://www.fujitsu.com/ca/en/Images/MB85RC16-DS501-00001-8v0-E.pdf - P...
如何将 Arduino 库与第二个 Sercom/第二个 I2c 总线一起使用
我正准备因没有适当地谷歌搜索而被排斥,但在过去的一天半里我一直在寻找解决方案,尝试了几十种方法,但没有任何效果。我是
假设我有一个 ADS1015 ADC 转换器和一个 Raspberry Pi。在我的项目中,我只需要读取模拟传感器的值。 这是用 Python 编写的用于 Rasp ADC 转换器的库...
pic18f4550 的 DHT11 代码不适用于 pic18f57Q84
我正在尝试读取PIC18f57Q84上的DHT11并将其显示到LCD屏幕上。我在网上发现有人对 PIC18f4550 做了这个,并试图让它在我的 PIC18f57Q84 开发板上工作。 ...
我正在使用该库通过 Beaglebone Black 上的 PRU 对 I2C 总线上的一些传感器进行采样。似乎只有第一笔交易才能正常工作,之后图书馆似乎...
I2C 读取返回零(RPi 4、SenseHat、Pi4J)
我正在使用 Raspberry Pi 4 和 Sense Hat 开发一个项目。我正在尝试从 Java 的帽子获取温度、湿度和气压读数。我不想使用 Python 或其他
我想在proteus中使用两个STM32F401xx MCU。其一为主人,其二为奴隶。 这是我给主人的代码: 使用(MicroC Pro For Arm)程序。 #包括 我想在STM32F401xx MCU中使用两个proteus。其中一个是成为 master,另一个是成为 slave。 这是我给大师的代码: 使用 (MicroC Pro For Arm) 程序。 #include <stdint.h> #include <stdio.h> uint8_t temp=0; void begin(uint8_t addr); void end(void); void Write (uint8_t dat); void main() { // Enable the I2C CLOCK and GPIO CLOCK RCC_APB1ENR |= (1<<21); // enable I2C CLOCK RCC_AHB1ENR |= (1<<1); // Enable GPIOB CLOCK // Configure the I2C PINs for ALternate Functions //PB8 and PB9 are connected to I2C1_SCL and I2C1_SDA GPIOB_MODER |= (2<<16) | (2<<18); GPIOB_OTYPER |= (1<<8) | (1<<9); GPIOB_OSPEEDR |= (3<<16) | (3<<18); GPIOB_PUPDR |= (1<<16) | (1<<18); GPIOB_AFRH |= (4<<0) | (4<<4); begin(0x08); Write(0x01); end(); } void begin(uint8_t addr){ //join I2C as a master mode //Generate a start condition I2C1_CR1 |= (1<<10); // Enable the ACK I2C1_CR1 |= (1<<8); // Generate START while (!(I2C1_SR1 & (1<<0))); // Wait for SB bit to set to 1 //Send the Slave Address to the DR Register I2C1_DR = addr; // send the address while (!(I2C1_SR1 & (1<<1))); // temp = I2C1_SR1 | I2C1_SR2; // read SR1 and SR2 to clear the ADDR bit // Reset the I2C I2C1_CR1 |= (1<<15); //I2C Peripheral under reset state -->page.493 manual I2C1_CR1 &= ~(1<<15); //I2C Peripheral not under reset -->page.493 manual // Program the peripheral input clock in I2C_CR2 Register in order to generate correct timings I2C1_CR2 |= (42 <<0); // PCLK1 FREQUENCY in MHz I2C1_CCR = 210<<0; // Configure the clock control registers I2C1_TRISE = 43; // Configure the rise time register I2C1_CR1 |= (1<<0); // Enable I2C } void end(void) { I2C1_CR1 |= (1<<9);//stop generation // Wait until the STOP condition is complete while (I2C1_SR2 & (1<<0)); //Cleared by hardware after detecting a Stop condition on the bus // Clear the STOP bit I2C1_CR1 &= ~(1<<9); } void Write (uint8_t dat) { while (!(I2C1_SR1 & (1<<7))); // wait for TXE bit to set I2C1_DR = dat ; // wait for BTF bit to set while (!(I2C1_SR1 & (1<<2))); //waiting while BTF=0 but when BTF=1; Data byte transfer succeeded } 从机代码: #include <stdint.h> #include <stdio.h> uint8_t temp=0; uint8_t state =0x00; void begin(uint8_t addr); void end(void); uint8_t Read (); void main() { RCC_APB1ENR |= (1<<21); // enable I2C CLOCK - RCC_AHB1ENR |= (1<<1); // Enable GPIOB CLOCK RCC_AHB1ENR |= (1<<0); // Enable GPIOA CLOCK GPIOA_MODER |=(1<<0); //set pin 0 as output // Configure the I2C PINs for ALternate Functions //PB8 and PB9 are connected to I2C1_SCL and I2C1_SDA GPIOB_MODER |= (2<<16) | (2<<18); GPIOB_OTYPER |= (1<<8) | (1<<9); GPIOB_OSPEEDR |= (3<<16) | (3<<18); GPIOB_PUPDR |= (1<<16) | (1<<18); GPIOB_AFRH |= (4<<0) | (4<<4); begin(0x08); state = Read(); end(); if (state == 0x01){ GPIOA_ODR |=(1<<0);//set 1 for pin 0 } } void begin(uint8_t addr){ //join I2C bus as a slave mode I2C1_CR2 |= (42<<0); // PCLK1 FREQUENCY in MHz I2C1_OAR1 = addr;//own address interface I2C1_CR1 |= (1<<0); // Enable I2C I2C1_CR1 |= (1<<10); // Enable the ACK ,indicate that a byte is received } void end(void) { I2C1_CR1 |= (1<<9);//stop generation // Wait until the STOP condition is complete while (I2C1_SR2 & (1<<0)); //Cleared by hardware after detecting a Stop condition on the bus // Clear the STOP bit I2C1_CR1 &= ~(1<<9); } uint8_t Read (){ uint8_t receivedData = 0; I2C1_CR1 &= ~(1<<10); // clear the ACK bit temp = I2C1_SR1 | I2C1_SR2; // read SR1 and SR2 to clear the ADDR bit.... EV6 condition I2C1_CR1 |= (1<<9); // Stop I2C while (!(I2C1_SR1 & (1<<6))); // wait for RxNE to set receivedData = I2C1_DR; // Read the data from the DATA REGISTER return receivedData; } 我尝试在Proteus上进行模拟,但是没有什么可以改变的,led still off。所以,我想知道如何在Proteus上制作simulation,如果我提供的代码有任何问题,我按照STM32F401xx的datasheet和manual来编写这个简单的驱动程序。 proteus 两个 STM32F401xx MCU 的连接: 你的主人的“开始”功能做了一些奇怪的事情。 I2C1_TRISE = 43; after 设置起始位怎么样?您在配置之前尝试使用 I2C。在使用任何应答或起始位之前,TRISE 必须是对 I2C 执行的首要操作之一。整个函数以奇怪的顺序执行操作。 寄存器中的“起始位”不启用起始位功能。当您写入时,它实际上会尝试立即发送一个起始位,并且在您的代码中,它会在您设置 TRISE 之前甚至在启用 I2C 外设之前发生。因此,行为是不可预测的。 我检查了F401的外设,它与F103的外设一模一样,只是F401多了一个用于模拟和数字噪声滤波器控制的寄存器。除此之外,它们是相同的并且完美地映射到另一个。 (根据勘误表,F401 不存在与 F103 相同的带有滤波器故障的硅缺陷)。 以下是我使用该外设的操作顺序,跳过了明显的 GPIO 备用功能设置,因此此处仅注册 I2C。这是 I2C 主设备配置,但一般设置是相同的,从设备配置和主设备配置之间的区别在于以下必要步骤: 配置GPIO,使能I2C时钟。 将CR2中的FREQ配置为APBx时钟频率(例如STM32运行在64MHz时为32,因为I2C的APBx运行在32000000Hz) 在CCR中配置时钟周期倍频器 配置 TRISE 的上升/下降时间 现在,如果您写入起始位,您可以将数据加载到 DR 并将其作为主设备发送。到目前为止,您不需要向 Start 位写入任何内容,也不需要向 ACK 位写入任何内容,这些位用于正在进行的通信,而不是用于配置。 对于从机,您可以进行类似的设置,但显然还需要配置其从机地址。 我觉得你太着急了。从主 MCU 开始,确保您首先可以在 I2C 线路上看到一些内容。
无法从 Arduino Uno 读取 Raspberry Pi 中的 I2C 数据(缓冲区为空)
我正在尝试通过 I2C 将从 Arduino Uno 发送的数据发送到我的 Raspberry Pi 4。我似乎能够从 Uno 毫无问题地发送数据,但数据没有在 Raspberry P 上读入...
将 platform_driver 与 i2c_driver 结合在一起的内核驱动程序
我正在为 LCD 编写内核驱动程序。该 LCD 使用 8 条 GPIO 线 (d0...d7) 发送数据以显示,一些 GPIO 控制信号(开/关、启用背光和读/写)和一个电位器来控制...
我正在尝试在Python上实现I2C通信的读取。我遇到的问题是,我从一个事务中读取两个字节的答案的传感器。有Python吗