FPDLINK中I2C通信的巧妙设计以及I2C Stretch

FPDLINK是TI设计的高速差分传输总线,主要用于传输图像数据,比如camera和显示数据。而且该标准还在不断的演进,从最初的一对线传输720P@60fps图像,到目前可以传输1080P@60fps,后续的芯片还可以支持更高的图像分辨率。传输距离也很远,能达到20米左右,非常适合汽车应用。

FPDLINK在传输的过程中有高速的前向通道,用于传输高速的图像数据和小部分的控制数据。也有速度相对较低的后向通道,用于传输反向的控制信息。前后向通信构成双向的控制通道,从而有了本文中将要讨论的FPDLINK中I2C的巧妙设计问题。

FPDLINK在使用中都是一个serializer和deserializer配对使用,CPU可以连接到serializer,也可以连接到deserializer,取决于具体的应用。比如,在camera应用中,camera sensor连接到serializer,将数据发送到deserializer,cpu则接收从deserializer发送过来的数据。在显示应用中,CPU则将数据发送给serializer,deserializer接收serializer的数据再传送给LCD屏进行显示。


CPU的i2c则可以连接到serializer或者deserializer的i2c。以下我们以上图的camera为例来讲解FPDLINK的i2c设计

  • 7
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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电气参数(如时钟频率、上拉电阻等)相同,以确保正确的通信
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值