嗨,对话我正在研究firewerals_demo,并找到UART的GPIO端口/引脚的初始化。但是没有代码做I2C的GPIO端口/引脚。我应该初始化I2C的GPIO端口/引脚吗?如何 ?或者我错过了什么?
谢谢
嗨jamesleo-konka,
请检查peripherals_demo\config\默认目录下的gpio_setup.h文件,在那里您将找到每一个使用的gpio的定义,然后在peri_setup .c中找到peirph_setup()函数,您将发现由hw_gpio_configure()函数初始化的引脚。
由于MT_dialog
嗨mt_dialog,抱歉,我错过了GPIO配置代码,它们被重新定义为CFG_GPIO_I2C1_SCL_PORT,并使用宏HW_GPIO_PINCONFIG初始化。
嗨mt_dialog,我在Project HRP_Sensor中的Periph_setup中放入以下代码:// -----------------------------/ /——I2C端口/销配置——P3.5 = sci, P1.2 = SDA—hw_gpio_configure_pin (HW_GPIO_PORT_3 HW_GPIO_PIN_5、HW_GPIO_MODE_OUTPUT HW_GPIO_FUNC_GPIO, true);hw_gpio_configure_pin (HW_GPIO_PORT_1 HW_GPIO_PIN_2、HW_GPIO_MODE_INPUT_PULLUP HW_GPIO_FUNC_GPIO, true);
hw_gpio_set_pin_function(HW_GPIO_PORT_3, HW_GPIO_PIN_5, HW_GPIO_MODE_OUTPUT, HW_GPIO_FUNC_I2C_SCL);hw_gpio_set_pin_function(hw_gpio_port_1,hw_gpio_pin_2,hw_gpio_mode_input_pullup,hw_gpio_func_i2c_sda);// -----------------------------这是对的吗?我对两个初始化函数有点困惑:hw_gpio_configure_pin, hw_gpio_set_pin_function。对于一个引脚,我们可以将其设置为输入/输出(带/不带拉,或push_pull,或speed),然后设置其他函数。为什么我要在两个函数中设置模式(输入/输出)两次?
为什么RX引脚设置为输出:hw_gpio_configure_pin(hw_gpio_port_2,hw_gpio_pin_3,hw_gpio_mode_output,hw_gpio_func_gpio,1);hw_gpio_set_pin_function(hw_gpio_port_2,hw_gpio_pin_3,hw_gpio_mode_output,hw_gpio_func_uart2_rx);?
在platform_devices.h中,有许多线才能in init i2c设备,如:i2c_slave_device(i2c1,bh1750,0x23,hw_i2c_addressing_7b,hw_i2c_speed_fast);
但是我找不到BH1750, MEM_24LC256,FM75,,,,的定义——它们也在ad_i2c_open()中使用。
hw_gpio_configure_pin()包括hw_gpio_set_pin_function(),您可以查看代码或doxygen来了解每个函数的描述。hw_gpio_set_pin_function()足以配置你的引脚,hw_gpio_configure_pin()做同样的事情,但它额外设置引脚的默认状态,如果它将是活动的或非活动的。原因相关的UART RX作为输出的设置和使用的两个函数来设置RX的UART我假设您看到这个periph_init hrp_sensor项目的()函数,所以,销的正上方设置有一个解释,简言之,这是Jlink模拟串口的解决方案。
没有定义,它们只是宏I2C_Slave_device使用的名称,并且在执行此后,您将能够使用它们以便打开适配器。
嗨mt_dialog,以下是I2C适配器的正确使用顺序:1.首先声明I2C设备:I2C_BUS (I2C1)I2C_SLAVE_DEVICE(I2C1, BME280, 0x76, HW_I2C_ADDRESSING_7B, HW_I2C_SPEED_STANDARD);//I2C_BUS_END2.I2C操作设备i2c_device开发;static char wbuf[5] = " Test ";char rbuf [5];dev = ad_i2c_open (BME280);/*打开所选设备*/ad_i2c_bus_acquire (dev);/*访问总线*/ad_i2c_write (dev, wbuf sizeof (wbuf));/*同步写入一些数据到I2C设备*///——这将生成START,发送SLAVE地址(W),发送reg地址,写入数据AD_I2C_READ(DEV,RBUF,SIZEOF(RBUF),100);/ *同步读取来自i2c设备的数据* / // i2c更改方向,生成重启,发送从地址(r),发送reg地址,读取数据,生成停止AD_I2C_BUS_RELEASE(DEV);/ *释放I2Cad_i2c_close (dev);/*关闭所选设备*/
另一个问题:1.何时使用AD_I2C_INIT()?2.如果启动任务后,应调用ad_i2c_xx吗?我可以在电源重置后进行I2C设备初始化(无任务运行)吗?4.要将一个数据写入I2C设备的寄存器,我可以参考以下内容:ad_i2c_write (dev wbuf 2);// 2字节,第一个= reg地址,第二个= data
嗨mt_dialog.非常感谢。有太多的宏,它不容易分析/跟踪源代码。
示例项目peripherals_demo会让用户混淆hw_i2c_xx和ad_i2c_xx,特别是在eeprom_24xx256.c中。hw_i2c_xx和ad_i2c_xx同时使用。
用户何时调用ad_i2c_init() ?我没有找到调用ad_i2c_init()的代码。
詹姆斯
你调用的命令序列取决于你使用的SDK,例如最新的SDK:
1)是的,您在I2C总线上的设备的分配是正确的。
2)获取设备的句柄当您即将启动事务是正确的(AD_I2C_OPEN(BME280))也是正确的,AD_I2C_BUS_AQUIRE()不是必需的,因为AD_I2C_WRITE()和AD_I2C_READ()执行AIRIES总线和设备以及释放总线和设备。
此外,只要将事项直接获取,因为您想生成重启条件,从总线读取时会生成重启条件,这意味着您必须提供(因此在I2C总线上写入)寄存器的地址您希望阅读,上面的代码我不认为在AD_I2C_WRITE()和AD_I2C_READ()之间生成重新启动条件(在AD_I2C_READ()操作期间在写入和读取读取的读取和读取读取条件)之间产生重新启动条件。在AD_I2C_WRITE和AD_I2C_READ之间,就我所知,应存在停止条件。生成重新启动条件是您在帖子中提及它的位置。
关于你的其他问题:
1)在prvsetuphardware()中的system_init()函数中调用ad_i2c_init(),在pm_system_init()函数中,有一个名为init_adapters()的附加函数,并且从该功能初始化所有启用的适配器。
2)系统将让适配器知道唤醒或启动,只要您已配置它们,适配器将初始化HW,当系统默认情况下启动或唤醒时会发生这种情况。
3)是的,我想你可以做到这一点。
嗨,MT_Dialog,谢谢你的帮助,我的ad_i2c_xx已经开始,I2C端口的输出已经得到。似乎ad_i2c_write()和ad_i2c_read()不能生成重启信号,因为它们都完成了I2C操作的完整步骤:start,从地址(w / r),数据(w / r),,,,,停止。用户是否应该使用hw_i2c_xx生成RESTART信号?请给我一个样品代码。
如上所述,通常在您希望从I2C从站读出一个值时生成重启条件(I2C主机将在总线上写入寄存器的地址,以便按顺序发出重新启动开始阅读)。ad_i2c_write()和ad_i2c_read()将执行单独的写入并读取。使用当前的I2C模块,使用68x的装备,您无法写入,然后强制重启条件以便为读取操作写入地址。出于此原因,如上所述,当您的FIFO是EMTPY时,I2C模块将自动生成停止条件,并且在更改操作时重启状态。
假设你开始在从服务器上写数据并且你想要读取,所以你必须在总线上写入从服务器的寄存器地址,所以你将提供地址,你想读到I2C FIFO,以不产生一个停止(记住,如果你的FIFO是空的,I2C将发送一个停止条件)。如果您提供的地址I2C奴隶,你想读模块没有办法知道,这是一个地址,你现在愿意阅读,并将发送地址相同的事务数据,因为你没有从写阅读为了生成一个重启。
总之,我不知道我知道为了强制在I2C上重新启动条件(也许你可以制作一个虚拟读取以强制重启,然后开始正确的阅读事务,写入地址并读取再一次,但这将导致两个重启条件,据我所知,我不确定奴隶如何处理这个问题)虽然我无法看到实际读写和写入之间的停止条件有什么问题?
嗨jamesleo-konka,
请检查peripherals_demo\config\默认目录下的gpio_setup.h文件,在那里您将找到每一个使用的gpio的定义,然后在peri_setup .c中找到peirph_setup()函数,您将发现由hw_gpio_configure()函数初始化的引脚。
由于MT_dialog
嗨mt_dialog,
抱歉,我错过了GPIO配置代码,它们被重新定义为CFG_GPIO_I2C1_SCL_PORT,并使用宏HW_GPIO_PINCONFIG初始化。
谢谢
嗨mt_dialog,
我在Project HRP_Sensor中的Periph_setup中放入以下代码:
// -----------------------------
/ /——I2C端口/销配置——P3.5 = sci, P1.2 = SDA—
hw_gpio_configure_pin (HW_GPIO_PORT_3 HW_GPIO_PIN_5、HW_GPIO_MODE_OUTPUT HW_GPIO_FUNC_GPIO, true);
hw_gpio_configure_pin (HW_GPIO_PORT_1 HW_GPIO_PIN_2、HW_GPIO_MODE_INPUT_PULLUP HW_GPIO_FUNC_GPIO, true);
hw_gpio_set_pin_function(HW_GPIO_PORT_3, HW_GPIO_PIN_5, HW_GPIO_MODE_OUTPUT, HW_GPIO_FUNC_I2C_SCL);
hw_gpio_set_pin_function(hw_gpio_port_1,hw_gpio_pin_2,hw_gpio_mode_input_pullup,hw_gpio_func_i2c_sda);
// -----------------------------
这是对的吗?
我对两个初始化函数有点困惑:hw_gpio_configure_pin, hw_gpio_set_pin_function。
对于一个引脚,我们可以将其设置为输入/输出(带/不带拉,或push_pull,或speed),然后设置其他函数。
为什么我要在两个函数中设置模式(输入/输出)两次?
为什么RX引脚设置为输出:
hw_gpio_configure_pin(hw_gpio_port_2,hw_gpio_pin_3,hw_gpio_mode_output,hw_gpio_func_gpio,1);
hw_gpio_set_pin_function(hw_gpio_port_2,hw_gpio_pin_3,hw_gpio_mode_output,hw_gpio_func_uart2_rx);?
在platform_devices.h中,有许多线才能in init i2c设备,如:
i2c_slave_device(i2c1,bh1750,0x23,hw_i2c_addressing_7b,hw_i2c_speed_fast);
但是我找不到BH1750, MEM_24LC256,FM75,,,,的定义——它们也在ad_i2c_open()中使用。
谢谢
嗨jamesleo-konka,
hw_gpio_configure_pin()包括hw_gpio_set_pin_function(),您可以查看代码或doxygen来了解每个函数的描述。hw_gpio_set_pin_function()足以配置你的引脚,hw_gpio_configure_pin()做同样的事情,但它额外设置引脚的默认状态,如果它将是活动的或非活动的。原因相关的UART RX作为输出的设置和使用的两个函数来设置RX的UART我假设您看到这个periph_init hrp_sensor项目的()函数,所以,销的正上方设置有一个解释,简言之,这是Jlink模拟串口的解决方案。
没有定义,它们只是宏I2C_Slave_device使用的名称,并且在执行此后,您将能够使用它们以便打开适配器。
由于MT_dialog
嗨mt_dialog,
以下是I2C适配器的正确使用顺序:
1.首先声明I2C设备:
I2C_BUS (I2C1)
I2C_SLAVE_DEVICE(I2C1, BME280, 0x76, HW_I2C_ADDRESSING_7B, HW_I2C_SPEED_STANDARD);//
I2C_BUS_END
2.I2C操作设备
i2c_device开发;
static char wbuf[5] = " Test ";
char rbuf [5];
dev = ad_i2c_open (BME280);/*打开所选设备*/
ad_i2c_bus_acquire (dev);/*访问总线*/
ad_i2c_write (dev, wbuf sizeof (wbuf));/*同步写入一些数据到I2C设备*///——这将生成START,发送SLAVE地址(W),发送reg地址,写入数据
AD_I2C_READ(DEV,RBUF,SIZEOF(RBUF),100);/ *同步读取来自i2c设备的数据* / // i2c更改方向,生成重启,发送从地址(r),发送reg地址,读取数据,生成停止
AD_I2C_BUS_RELEASE(DEV);/ *释放I2C
ad_i2c_close (dev);/*关闭所选设备*/
另一个问题:
1.何时使用AD_I2C_INIT()?
2.如果启动任务后,应调用ad_i2c_xx吗?我可以在电源重置后进行I2C设备初始化(无任务运行)吗?
4.要将一个数据写入I2C设备的寄存器,我可以参考以下内容:
ad_i2c_write (dev wbuf 2);// 2字节,第一个= reg地址,第二个= data
谢谢
嗨mt_dialog.
非常感谢。
有太多的宏,它不容易分析/跟踪源代码。
示例项目peripherals_demo会让用户混淆hw_i2c_xx和ad_i2c_xx,特别是在eeprom_24xx256.c中。hw_i2c_xx和ad_i2c_xx同时使用。
用户何时调用ad_i2c_init() ?我没有找到调用ad_i2c_init()的代码。
詹姆斯
嗨jamesleo-konka,
你调用的命令序列取决于你使用的SDK,例如最新的SDK:
1)是的,您在I2C总线上的设备的分配是正确的。
2)获取设备的句柄当您即将启动事务是正确的(AD_I2C_OPEN(BME280))也是正确的,AD_I2C_BUS_AQUIRE()不是必需的,因为AD_I2C_WRITE()和AD_I2C_READ()执行AIRIES总线和设备以及释放总线和设备。
此外,只要将事项直接获取,因为您想生成重启条件,从总线读取时会生成重启条件,这意味着您必须提供(因此在I2C总线上写入)寄存器的地址您希望阅读,上面的代码我不认为在AD_I2C_WRITE()和AD_I2C_READ()之间生成重新启动条件(在AD_I2C_READ()操作期间在写入和读取读取的读取和读取读取条件)之间产生重新启动条件。在AD_I2C_WRITE和AD_I2C_READ之间,就我所知,应存在停止条件。生成重新启动条件是您在帖子中提及它的位置。
关于你的其他问题:
1)在prvsetuphardware()中的system_init()函数中调用ad_i2c_init(),在pm_system_init()函数中,有一个名为init_adapters()的附加函数,并且从该功能初始化所有启用的适配器。
2)系统将让适配器知道唤醒或启动,只要您已配置它们,适配器将初始化HW,当系统默认情况下启动或唤醒时会发生这种情况。
3)是的,我想你可以做到这一点。
由于MT_dialog
嗨,MT_Dialog,
谢谢你的帮助,我的ad_i2c_xx已经开始,I2C端口的输出已经得到。
似乎ad_i2c_write()和ad_i2c_read()不能生成重启信号,因为它们都完成了I2C操作的完整步骤:start,从地址(w / r),数据(w / r),,,,,停止。
用户是否应该使用hw_i2c_xx生成RESTART信号?请给我一个样品代码。
谢谢
嗨jamesleo-konka,
如上所述,通常在您希望从I2C从站读出一个值时生成重启条件(I2C主机将在总线上写入寄存器的地址,以便按顺序发出重新启动开始阅读)。ad_i2c_write()和ad_i2c_read()将执行单独的写入并读取。使用当前的I2C模块,使用68x的装备,您无法写入,然后强制重启条件以便为读取操作写入地址。出于此原因,如上所述,当您的FIFO是EMTPY时,I2C模块将自动生成停止条件,并且在更改操作时重启状态。
假设你开始在从服务器上写数据并且你想要读取,所以你必须在总线上写入从服务器的寄存器地址,所以你将提供地址,你想读到I2C FIFO,以不产生一个停止(记住,如果你的FIFO是空的,I2C将发送一个停止条件)。如果您提供的地址I2C奴隶,你想读模块没有办法知道,这是一个地址,你现在愿意阅读,并将发送地址相同的事务数据,因为你没有从写阅读为了生成一个重启。
总之,我不知道我知道为了强制在I2C上重新启动条件(也许你可以制作一个虚拟读取以强制重启,然后开始正确的阅读事务,写入地址并读取再一次,但这将导致两个重启条件,据我所知,我不确定奴隶如何处理这个问题)虽然我无法看到实际读写和写入之间的停止条件有什么问题?
由于MT_dialog