跳过主要内容

I2C IO端口初始化

DA1468x

4年前

发布的jamesleo-konka0点 9回复
0的问题

嗨,对话框
我正在研究peripherals_demo,并找到UART的GPIO端口/引脚的初始化。
但是没有代码做I2C的GPIO端口/引脚。
我应该初始化I2C的GPIO端口/引脚吗?如何?还是我错过了什么?

谢谢

接受答案!

4年前

MT_dialog -30点

嗨jamesleo-konka,

请检查peripherals_demo\config\default目录下的gpio_setup.h文件,在那里你会找到每一个使用的gpio的定义,然后在peripherals_setup .c中的peirph_setup()函数中你会找到hw_gpio_configure()函数对引脚的初始化。

由于MT_dialog

4年前

jamesleo-konka 0点

嗨MT_Dialog,
对不起,我错过了GPIO配置代码,它们被重新定义为CFG_GPIO_I2C1_SCL_PORT,并使用宏HW_GPIO_PINCONFIG进行初始化。

谢谢

4年前

jamesleo-konka 0点

嗨MT_Dialog,
我把下面的代码放在项目hrp_sensor中的peripher_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);
//------------------------------
这是对的吗?
我对两个init函数有点困惑:hw_gpio_configure_pin, hw_gpio_set_pin_function。
对于一个引脚,我们可以将它设置为输入/输出(带/不带pull,或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中,有很多用来初始化I2C设备的行,比如:
I2C_SLAVE_DEVICE(I2C1, BH1750, 0x23, HW_I2C_ADDRESSING_7B, HW_I2C_SPEED_FAST);

但是我找不到BH1750, MEM_24LC256,FM75,,,,的定义——它们也在ad_i2c_open()中使用。

谢谢

接受答案!

4年前

MT_dialog -30点

嗨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

4年前

jamesleo-konka 0点

嗨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] = "测试";
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改变方向,生成RESTART,发送SLAVE地址(R),发送reg地址,读取数据,生成STOP
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

谢谢

4年前

jamesleo-konka 0点

嗨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()的代码。

詹姆斯

接受答案!

4年前

MT_dialog -30点

嗨jamesleo-konka,

你调用的命令序列取决于你正在使用的SDK,例如在最新的SDK上:

1)是的,您在I2C总线上分配的设备是正确的。

2)的处理设备,当你即将开始一个事务是适当的(ad_i2c_open (BME280))也是正确的,这个ad_i2c_bus_aquire ad_i2c_write以来()不是必需的()和ad_i2c_read()执行公共汽车的本事和设备也释放总线和设备。

同时,直接把事情因为你想生成一个重启状态,启动条件生成从总线读取时,这意味着你将不得不提供(因此写在i2c总线)寄存器的地址,你会喜欢阅读,上面的代码我不认为会在ad_i2c_write()和ad_i2c_read()之间产生重启条件(重启条件是在ad_i2c_read()操作期间在总线上的写和读之间触发)。据我所知,在ad_i2c_write和ad_i2c_read之间应该有一个STOP条件。重新启动条件是在您的文章中提到的地方生成的。

关于你的其他问题:

1)在prvsetuhardware()的system_init()函数中调用ad_i2c_init(),在pm_system_init()函数中有一个额外的函数叫做init_adapters(),所有启用的适配器都是从这个函数初始化的。

2)系统将让适配器知道唤醒或电源,适配器将初始化hw,只要你已经配置了他们,这发生在系统通电或唤醒默认。

是的,我想你能做到。

由于MT_dialog

4年前

jamesleo-konka 0点

嗨,MT_Dialog,
谢谢你的帮助,我的ad_i2c_xx已经开始了,我得到了I2C端口的输出。
看起来ad_i2c_write()和ad_i2c_read()不能生成RESTART信号,因为它们都完成了I2C操作的完整步骤:START, SLAVE address (W/R), data(W/R),,,,STOP。
是否使用hw_i2c_xx产生RESTART信号?请给我一个样品代码。

谢谢

接受答案!

4年前

MT_dialog -30点

嗨jamesleo-konka,

正如上面提到的,通常生成的启动条件当你想读值从I2C奴隶(I2C总线上的大师写的地址注册,喜欢阅读,然后重启问题为了开始阅读)。ad_i2c_write()和ad_i2c_read()将分别执行写和读操作。在68x配备的当前I2C模块中,您不能写入,然后强制重新启动条件,以便为读取操作写入地址。原因是,如前所述,I2C模块将在FIFO为空时自动生成STOP条件,并在更改操作时自动生成RESTART条件。

假设你开始在从服务器上写数据你决定要读,你需要写从服务器的寄存器地址,你想读的地址,在总线上,因此,您将提供希望读给I2C FIFO以避免生成STOP的地址(请记住,如果您的FIFO为空,I2C将发送一个STOP条件)。如果您提供的地址I2C奴隶,你想读模块没有办法知道,这是一个地址,你现在愿意阅读,并将发送地址相同的事务数据,因为你没有从写阅读为了生成一个重启。

综上所述,我没有办法知道为了强制I2C上的RESTART条件(也许你可以做一个假读,为了强制RESTART,然后开始正确的读事务,写地址,再读,但这将导致两个重启条件,就我所能告诉,我不确定任何奴隶将如何处理那),虽然我不能看到什么是错误的停止条件之间的实际读和写?

由于MT_dialog