Electricity/FWLIB/include/ENS1_IIC.h

154 lines
4.0 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
*Copyright ,2023 , NANOCHAP
*File name: ENS1_I2C.H
*Author:
*Version: V1.0
*Date: 2023-11-
*Description:
*Function List:
History:
1.V1.0
Date:
Author:
Modification: 初版
*/
#ifndef ENS1_IIC_H
#define ENS1_IIC_H
#include "my_header.h"
#include "ens1_uart.h"
#include "ENS1_GPIO.h"
/*
一、引脚关系:
ALT Function1
IIC0 SCL --- GPIO6
IIC0 SDA --- GPIO7
ALT Function2
IIC1 SCL --- GPIO8
IIC1 SDA --- GPIO9
ENS1 IIC
1、标准模式100khz 快速模式 400khz
2、DMA
3、主机模式下通过软件发出启停信号
4、从机模式下接口可以识别自己的地址和一般呼叫地址一般呼叫地址监测可以通过软件使能或失能
5、数据和地址的传输以8位大端模式开始后的字节包含地址信息7bit地址模式是一字节10bit地址模式是2字节
地址总时在主机模式下传输。
6、在一个字节传输的8个时钟周期后的第九个时钟接收端必须发送一个应答位给传输端
应答可以被软件使能或者失能可以通过软件选择地址是7位还是10位的。
特性说明:
1、可做主、从端
2、半双工通讯仅发送或接收
3、7位 / 10位的寻址或检测
4、支持不同传输速率 100k 400k
5、模拟噪声滤波器
6、状态标志
1传输/接收模式标志
2字节结束传输标志
3IIC 繁忙标志
7、数据总是大端模式
8、错误标志
1主模式下:仲裁丢失状态
2地址 / 数据传输后应答失败
3错位启动或停止 状态的检测
9、1字节缓冲带有DMA功能
*/
/*
错误状态(会造成通讯失败)
1 总线错误 BUS ERROR
2 应答错误 AD
3 仲裁
4 溢出/下溢 错误
*/
/*IIC 速度选择*/
#define IIC_STARDARD_MODE_10K 0x0
#define IIC_STARDARD_MODE_20K 0x1
#define IIC_STARDARD_MODE_100K 0x9
#define IIC_FAST_MODE_110K 0xA
#define IIC_FAST_MODE_120K 0xB
#define IIC_FAST_MODE_400K 0x27
#define IIC_HIGH_MODE_500K 0x28
#define IIC_HIGH_MODE_600K 0x29
#define IIC_HIGH_MODE_1500K 0x2E
/*中断使能*/
#define IIC_ITERREN (1<<6) //error 使能
#define IIC_ITEVTEN (1<<7) //事件中断使能
#define IIC_ITBUFEN (1<<8) //缓冲区中断使能
#define IIC_DMAEN (1<<9) //DMA使能
typedef enum{IIC_MASTER=0, IIC_SLAVE=1}IIC_MODE ;
typedef struct IIC_Config_Struct
{
IIC_MODE MODE;
uint32_t OWN_ADDRESS;
bool ACK_EN;
uint8_t IIC_SPEED;
}IIC_ConfigStructure;
extern IIC_ConfigStructure IIC0_Config;
extern IIC_ConfigStructure IIC1_Config;
//bus error 判断ITERREN使能
extern bool IIC_BUS_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx);
//应答错误判断
extern bool IIC_ACK_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx);
//仲裁
extern bool IIC_ARBITRAT_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx);
//溢出/下溢错误
extern bool IIC_OVERRUN_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx);
//ITEVFEN使能后有如下事件
//起始状态,起始位发送(主机模式)
extern bool IIC_SB_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx);
//地址发送(主机模式) / 地址匹配(从机事件)
extern bool IIC_ADDR_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx);
//主机模式下主机已发送10bit地址数据的第一个字节
extern bool IIC_ADD10_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx);
//从机模式下,停止条件被接收到
extern bool IIC_STOPF_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx);
//数据字节传输成功
extern bool IIC_BTF_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx);
//ITEVFEN 且 ITBUFEN 使能后,有如下事件
//数据寄存器非空(接受器读到数据)
extern bool IIC_RxNE_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx);
//数据寄存器空(传输完数据)
extern bool IIC_TxE_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx);
//总线状态:繁忙与否
extern uint8_t IIC_Bus_BUSY(CMSDK_I2C_TypeDef* CMSDK_I2Cx);
//模式确认
extern bool IIC_MASTER_MODE(CMSDK_I2C_TypeDef* CMSDK_I2Cx);
//IIC配置初始化
extern uint8_t IIC_Config_init(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,IIC_ConfigStructure* IIC_Para );
//使能与失能IIC
extern void IIC_Cmd(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,FunctionalState NewState) ;
//应答选择
extern void IIC_Ackconfig(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,FunctionalState NewState );
//生成START 信号
extern void IIC_GenerateSTART(CMSDK_I2C_TypeDef* CMSDK_I2Cx);
//生成STOP信号
extern void IIC_GenerateSTOP(CMSDK_I2C_TypeDef* CMSDK_I2Cx);
//IIC发送数据
extern void IIC_SendData(CMSDK_I2C_TypeDef* CMSDK_I2Cx , uint8_t data);
extern void IIC_ITConfig(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,uint16_t IIC_IT_SEL ,FunctionalState NewState);
#endif