【沁恒RISC-V内核 CH582】I2C 事件函数
[复制链接]
CH583 和 CH582 芯片提供 I2C 接口,特性如下: l 支持主机模式(Master)和从机模式(Slave),支持多主多从。 l 支持两种速度模式:100KHz 和 400KHz,兼容 I 2 C 两线串行总线规范。 l 支持 7 位或 10 位地址。 l 从设备支持双 7 位地址。 l 支持总线广播。 l 支持总线仲裁、错误检测、PEC 校验、延长时钟。 l 兼容 SMBus。
今天在外面,先熟悉一下硬件I2C的发送流程。回家时把用硬I2C驱动SSD1306OLED。以及SHT30.
/*******************************************************************************
* Function Name : I2C_CheckEvent
* Description : 检查最后一个 I2Cx 事件是否等于传递的事件
* as parameter.
* Input : I2C_EVENT: 指定要检查的事件.
* I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED : EV1.从机_发送器_地址_匹配
* I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED : EV1. 从机_接收器_地址_匹配
* I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED : EV1. 从机\发送器\第二地址\匹配
* I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED : EV1. 从机\接收器\第二地址\匹配
* I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED : EV1. 从机_一般调用地址_匹配
* I2C_EVENT_SLAVE_BYTE_RECEIVED : EV2. 从字节接收
* (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_DUALF) : EV2. 从机_字节_接收| I2C_标志_DUALF
* (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_GENCALL) : EV2. 从机字节接收I2C标志GENCALL
* I2C_EVENT_SLAVE_BYTE_TRANSMITTED : EV3. 从字节被传输
* (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_DUALF) : EV3. 从_字节_传输| I2C_标志DUALF
* (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL) : EV3. 从_字节_传输| I2C_标志_GENCALL
* I2C_EVENT_SLAVE_ACK_FAILURE : EV3_2. 从机_确认_故障
* I2C_EVENT_SLAVE_STOP_DETECTED : EV4. 从站_停止_检测到
* I2C_EVENT_MASTER_MODE_SELECT : EV5. 主控_模式_选择
* I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED : EV6. 主控_变送器_模式_选择
* I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED : EV6. 主机_接收器_模式_选择
* I2C_EVENT_MASTER_BYTE_RECEIVED : EV7. 主字节_接收
* I2C_EVENT_MASTER_BYTE_TRANSMITTING : EV8. 主字节_传输
* I2C_EVENT_MASTER_BYTE_TRANSMITTED : EV8_2. 主字节_传输
* I2C_EVENT_MASTER_MODE_ADDRESS10 : EV9. 主模式_地址10
* Return : 1 - SUCCESS or 0 - ERROR.
*******************************************************************************/
作为主发送:
1、配置
I2C_Init( I2C_Mode_I2C, //模式
400000, // 指定时钟频率(Hz),此参数必须设置为低于400kHz的值
I2C_DutyCycle_16_9, //指定I2C快速模式占空比 有I2C_DutyCycle_16_9、 I2C_DutyCycle_2
I2C_Ack_Enable, //I2C_Ack 启用或禁用确认
I2C_AckAddr_7bit, //7位或10位地址。
TxAdderss, //指定第一个设备自己的地址。
);
2、检查总线是否可用
while( I2C_GetFlagStatus( I2C_FLAG_BUSY ) != RESET );
3、生成I2Cx通信启动条件。START
I2C_GenerateSTART( ENABLE );
4、等待自动 地切换到主模式
while( !I2C_CheckEvent( I2C_EVENT_MASTER_MODE_SELECT ) );
5、发送从机地址 选择发送、接收模式
I2C_Send7bitAddress( RxAdderss, I2C_Direction_Transmitter );
6、等待主发送模式
while( !I2C_CheckEvent( I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ) );
7、检查发送寄存器是否为空
if( I2C_GetFlagStatus( I2C_FLAG_TXE ) != RESET )
8、发送1-N个字节
I2C_SendData( TxData[i] );
9、等待发送完成事件
while( !I2C_CheckEvent( I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
10、产生停止标志
I2C_GenerateSTOP( ENABLE );
发送结束。
|