154 lines
4.0 KiB
C
154 lines
4.0 KiB
C
/*
|
||
*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)字节结束传输标志
|
||
(3)IIC 繁忙标志
|
||
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
|