GD32F350与MC3416实现I2C通讯
时间: 2024-05-16 20:14:37 浏览: 237
GD32F350和MC3416都支持I2C通信协议,因此它们之间可以通过I2C进行通信。以下是实现I2C通信的一般步骤:
1. 配置GD32F350的I2C控制器和MC3416的I2C从设备。
2. 在GD32F350中编写I2C主设备代码,包括发送I2C起始信号、发送I2C地址、发送I2C数据以及接收I2C数据等。
3. 在MC3416中编写I2C从设备代码,包括接收I2C地址、接收I2C数据等。
4. 在GD32F350和MC3416之间发送和接收数据。
以下是一个简单的GD32F350和MC3416之间的I2C通信示例:
```c
// GD32F350主设备代码
#include "gd32f3x0.h"
#define I2C0_SCL_PIN GPIO_PIN_6
#define I2C0_SDA_PIN GPIO_PIN_7
#define I2C0_GPIO_PORT GPIOB
#define I2C0_GPIO_CLK RCU_GPIOB
#define I2C0_CLK RCU_I2C0
#define I2C0_ADDR 0x50
i2c_init_para_struct i2c_init_structure;
i2c_ack_config_enum ack_config;
void i2c0_gpio_config(void)
{
rcu_periph_clock_enable(I2C0_GPIO_CLK);
gpio_init(I2C0_GPIO_PORT, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, I2C0_SCL_PIN);
gpio_init(I2C0_GPIO_PORT, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, I2C0_SDA_PIN);
gpio_pin_remap_config(GPIO_I2C0_REMAP, ENABLE);
}
void i2c0_config(void)
{
rcu_periph_clock_enable(I2C0_CLK);
i2c_deinit(I2C0);
i2c_init_structure.addressing_mode = I2C_ADDRESSING_MODE_7BIT;
i2c_init_structure.ck_scl_frequency = 100000;
i2c_init_structure.duty_cycle = I2C_DUTYCYCLE_2;
i2c_init_structure.general_call_filter = DISABLE;
i2c_init_structure.no_stretch_mode = I2C_NOSTRETCH_ENABLE;
i2c_init(I2C0, &i2c_init_structure);
i2c_ack_config(I2C0, ack_config);
i2c_enable(I2C0);
}
void i2c0_send_data(uint8_t data)
{
i2c_data_transmit(I2C0, I2C0_ADDR, I2C_DATA_TRANSMIT_ACK);
while(i2c_flag_get(I2C0, I2C_FLAG_TBE) == RESET);
i2c_data_transmit(I2C0, data, I2C_DATA_TRANSMIT_ACK);
while(i2c_flag_get(I2C0, I2C_FLAG_TBE) == RESET);
}
uint8_t i2c0_receive_data(void)
{
uint8_t data;
i2c_ackpos_config(I2C0, I2C_ACKPOS_NEXT);
i2c_ack_config(I2C0, I2C_ACK_ENABLE);
i2c_data_receive(I2C0);
while(i2c_flag_get(I2C0, I2C_FLAG_RBNE) == RESET);
data = i2c_data_receive(I2C0);
i2c_ack_config(I2C0, I2C_ACK_DISABLE);
return data;
}
int main(void)
{
i2c0_gpio_config();
i2c0_config();
i2c0_send_data(0x01);
uint8_t data = i2c0_receive_data();
return 0;
}
```
```c
// MC3416从设备代码
#include "mc3416.h"
#define I2C0_ADDR 0x50
void i2c0_receive_data(void)
{
uint8_t addr = i2c_slave_address_receive(I2C0);
if (addr == I2C0_ADDR)
{
uint8_t data = i2c_data_receive(I2C0);
}
}
int main(void)
{
i2c0_config();
while (1)
{
i2c0_receive_data();
}
return 0;
}
```
需要注意的是,在实现I2C通信之前,需要确保GD32F350和MC3416之间的I2C电气参数(如时钟频率、上拉电阻等)相同,以确保正确的通信。
阅读全文
相关推荐
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)