362 lines
8.1 KiB
C
362 lines
8.1 KiB
C
/*
|
||
*Copyright ,2023 , NANOCHAP
|
||
*File name: ENS1_I2C.C
|
||
*Author:
|
||
*Version: V1.0
|
||
*Date: 2023-11-
|
||
*Description:
|
||
*Function List:
|
||
|
||
History:
|
||
1.V1.0
|
||
Date:
|
||
Author:
|
||
Modification: 初版
|
||
*/
|
||
|
||
#include "ENS1_IIC.h"
|
||
|
||
IIC_ConfigStructure IIC0_Config =
|
||
{
|
||
.MODE = IIC_SLAVE ,
|
||
.OWN_ADDRESS = 0x78 ,
|
||
.ACK_EN = true ,
|
||
.IIC_SPEED = IIC_STARDARD_MODE_10K ,
|
||
};
|
||
|
||
IIC_ConfigStructure IIC1_Config =
|
||
{
|
||
.MODE = IIC_SLAVE ,
|
||
.OWN_ADDRESS = 0x78 ,
|
||
.ACK_EN = true ,
|
||
.IIC_SPEED = IIC_STARDARD_MODE_10K ,
|
||
};
|
||
|
||
|
||
//bus error 判断(ITERREN使能)
|
||
bool IIC_BUS_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 8)&0x1) ? true :false);}
|
||
//应答错误判断
|
||
bool IIC_ACK_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 10)&0x1) ? true :false);}
|
||
//仲裁
|
||
bool IIC_ARBITRAT_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 9)&0x1) ? true :false);}
|
||
//溢出/下溢错误
|
||
bool IIC_OVERRUN_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 11)&0x1) ? true :false);}
|
||
|
||
//ITEVFEN使能后有如下事件
|
||
//起始状态,起始位发送(主机模式)
|
||
bool IIC_SB_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS)&0x1) ? true :false);}
|
||
//地址发送(主机模式) / 地址匹配(从机事件)
|
||
bool IIC_ADDR_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 1)&0x1) ? true :false);}
|
||
//主机模式下,主机已发送10bit地址数据的第一个字节!!!
|
||
bool IIC_ADD10_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 3)&0x1) ? true :false);}
|
||
//从机模式下,停止条件被接收到
|
||
bool IIC_STOPF_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 4)&0x1) ? true :false);}
|
||
//数据字节传输成功
|
||
bool IIC_BTF_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 2)&0x1) ? true :false);}
|
||
|
||
//ITEVFEN 且 ITBUFEN 使能后,有如下事件
|
||
//数据寄存器非空(接受器读到数据)
|
||
bool IIC_RxNE_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 5)&0x1) ? true :false);}
|
||
//数据寄存器空(传输完数据)
|
||
bool IIC_TxE_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 6)&0x1) ? true :false);}
|
||
|
||
//总线状态:繁忙与否
|
||
uint8_t IIC_Bus_BUSY(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (uint8_t)(((CMSDK_I2Cx->I2C_STS >> 13)&0x1) ? 1 :0);};
|
||
|
||
//模式确认
|
||
bool IIC_MASTER_MODE(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 12)&0x1) ? true :false);}
|
||
|
||
uint8_t IIC_Config_init(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,IIC_ConfigStructure* IIC_Para )
|
||
{
|
||
if(CMSDK_I2Cx == CMSDK_I2C0)
|
||
{
|
||
GPIO_AltFunction(GPIO_6 , ALT_FUNC1);
|
||
GPIO_AltFunction(GPIO_7 , ALT_FUNC1);
|
||
}
|
||
else if(CMSDK_I2Cx == CMSDK_I2C1)
|
||
{
|
||
GPIO_AltFunction(GPIO_8 , ALT_FUNC2);
|
||
GPIO_AltFunction(GPIO_9 , ALT_FUNC2);
|
||
}
|
||
if(IIC_Para->MODE == IIC_SLAVE)
|
||
{
|
||
// CMSDK_I2Cx->I2C_CR2|=(1<<7);//|(1<<8);//中断使能--bit8:buffer中断 / bit7:事件中断 / bit6:错误中断
|
||
CMSDK_I2Cx->I2C_CR1|=(1);
|
||
CMSDK_I2Cx->I2C_OAR = IIC_Para->OWN_ADDRESS ;
|
||
if(IIC_Para->ACK_EN == true)
|
||
CMSDK_I2Cx->I2C_CR1 |= (1<<5);
|
||
}
|
||
else
|
||
{
|
||
/*
|
||
IIC master transmitter:
|
||
IIC_CR2:配置中断时钟频率
|
||
IIC_CR1:使能IIC接口
|
||
IIC_CR1:配置START 位 IIC主机
|
||
*/
|
||
CMSDK_I2Cx->I2C_CR2 |= IIC_Para->IIC_SPEED ;
|
||
CMSDK_I2Cx->I2C_CR1 |= (1) ;
|
||
CMSDK_I2Cx->I2C_OAR = IIC_Para->OWN_ADDRESS ;
|
||
if(IIC_Para->ACK_EN == true)
|
||
CMSDK_I2Cx->I2C_CR1 |= (1<<5);
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
void IIC_ITConfig(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,uint16_t IIC_IT_SEL ,FunctionalState NewState)
|
||
{
|
||
if(CMSDK_I2Cx == CMSDK_I2C1){
|
||
CMSDK_I2C1->I2C_CR2 |= IIC_IT_SEL;
|
||
NVIC_DisableIRQ(I2C1_Event_IRQn);
|
||
NVIC_ClearPendingIRQ(I2C1_Event_IRQn);
|
||
NVIC_DisableIRQ(I2C1_Error_IRQn);
|
||
NVIC_ClearPendingIRQ(I2C1_Error_IRQn);
|
||
if(NewState == ENABLE)
|
||
NVIC_EnableIRQ(I2C1_Event_IRQn);
|
||
}
|
||
else if(CMSDK_I2Cx == CMSDK_I2C0){
|
||
CMSDK_I2C0->I2C_CR2 |= IIC_IT_SEL;
|
||
NVIC_DisableIRQ(I2C0_Event_IRQn);
|
||
NVIC_ClearPendingIRQ(I2C0_Event_IRQn);
|
||
NVIC_DisableIRQ(I2C0_Error_IRQn);
|
||
NVIC_ClearPendingIRQ(I2C0_Error_IRQn);
|
||
if(NewState == ENABLE)
|
||
NVIC_EnableIRQ(I2C0_Event_IRQn);
|
||
}
|
||
}
|
||
|
||
void IIC_Cmd(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,FunctionalState NewState) //使能IIC外设
|
||
{
|
||
if(CMSDK_I2Cx ==CMSDK_I2C0)
|
||
{
|
||
PCLK_Enable(I2C0_PCLK_EN);
|
||
}
|
||
else if(CMSDK_I2Cx ==CMSDK_I2C1)
|
||
{
|
||
PCLK_Enable(I2C1_PCLK_EN);
|
||
}
|
||
else
|
||
{
|
||
|
||
}
|
||
|
||
if(NewState == ENABLE)
|
||
CMSDK_I2Cx->I2C_CR1 |= (1);
|
||
else
|
||
CMSDK_I2Cx->I2C_CR1 &=~ (1);
|
||
}
|
||
|
||
void IIC_GenerateSTART(CMSDK_I2C_TypeDef* CMSDK_I2Cx)
|
||
{
|
||
while(IIC_Bus_BUSY(CMSDK_I2Cx));
|
||
CMSDK_I2Cx->I2C_CR1 |= (1<<3);
|
||
}
|
||
|
||
void IIC_GenerateSTOP(CMSDK_I2C_TypeDef* CMSDK_I2Cx)
|
||
{
|
||
CMSDK_I2Cx->I2C_CR1 |= (1<<4);
|
||
}
|
||
|
||
//general call 用于向总线所有设备发送消息,用于初始化从设备与设备同步
|
||
//主设备通过向总线发送0x00地址来触发GENERAL CALL
|
||
void IIC_GeneralCallCmd(CMSDK_I2C_TypeDef* CMSDK_I2Cx)
|
||
{
|
||
|
||
}
|
||
|
||
void IIC_Send7bitAddress(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,uint8_t Address)
|
||
{
|
||
CMSDK_I2Cx->I2C_DR = Address ;
|
||
}
|
||
|
||
void IIC_SendData(CMSDK_I2C_TypeDef* CMSDK_I2Cx , uint8_t data)
|
||
{
|
||
CMSDK_I2Cx->I2C_DR = data;
|
||
while(IIC_BTF_EVENT(CMSDK_I2Cx) == false); //字节传输完成
|
||
}
|
||
|
||
uint8_t IIC_ReadData(CMSDK_I2C_TypeDef* CMSDK_I2Cx)
|
||
{
|
||
return CMSDK_I2Cx->I2C_DR;
|
||
}
|
||
|
||
|
||
|
||
void I2C0_Event_Handler(void)
|
||
{
|
||
NVIC_ClearPendingIRQ(I2C0_Event_IRQn);
|
||
if(IIC_MASTER_MODE(CMSDK_I2C0) == TRUE)
|
||
{
|
||
if(IIC_SB_EVENT(CMSDK_I2C0) == true )
|
||
{
|
||
return ;
|
||
}
|
||
|
||
if(IIC_ADDR_EVENT(CMSDK_I2C0) == true )
|
||
{
|
||
return ;
|
||
}
|
||
|
||
if(IIC_ADD10_EVENT(CMSDK_I2C0) == true)
|
||
{
|
||
return;
|
||
}
|
||
}
|
||
|
||
else
|
||
{
|
||
if(IIC_ADDR_EVENT(CMSDK_I2C0) == true)
|
||
{
|
||
return ;
|
||
}
|
||
if(IIC_STOPF_EVENT(CMSDK_I2C0) == true)
|
||
{
|
||
//如果不再接收,则关闭IIC!!!
|
||
IIC_Cmd(CMSDK_I2C0 ,DISABLE) ;
|
||
CMSDK_I2C0->I2C_CR2|=(1<<7); //中断使能--bit8:buffer中断 / bit7:事件中断 / bit6:错误中断
|
||
CMSDK_I2C0->I2C_CR1|=(1);
|
||
CMSDK_I2C0->I2C_OAR = 0X78 ;
|
||
CMSDK_I2C0->I2C_CR1 |= (1<<5);
|
||
IIC_Cmd(CMSDK_I2C0 ,ENABLE) ;
|
||
return ;
|
||
}
|
||
}
|
||
|
||
if(IIC_BTF_EVENT(CMSDK_I2C0) == true)
|
||
{
|
||
|
||
}
|
||
|
||
if(IIC_RxNE_EVENT(CMSDK_I2C0) == true)
|
||
{
|
||
uint8_t read_data = (uint8_t)(CMSDK_I2C0->I2C_DR & 0xff);
|
||
printf("%d\n", read_data);
|
||
}
|
||
|
||
if(IIC_TxE_EVENT(CMSDK_I2C0) == true)
|
||
{
|
||
|
||
}
|
||
return ;
|
||
}
|
||
|
||
void I2C0_Error_Handler(void)
|
||
{
|
||
NVIC_ClearPendingIRQ(I2C0_Error_IRQn);
|
||
|
||
if(IIC_BUS_ERROR(CMSDK_I2C0) == true)
|
||
{
|
||
printf("bus error\n");
|
||
return ;
|
||
}
|
||
|
||
if(IIC_ACK_ERROR(CMSDK_I2C0) == true)
|
||
{
|
||
printf("IIC_ACK_ERROR\n");
|
||
return ;
|
||
}
|
||
|
||
if(IIC_ARBITRAT_ERROR(CMSDK_I2C0) == true)
|
||
{
|
||
printf("IIC_ARBITRAT_ERROR\n");
|
||
return ;
|
||
}
|
||
|
||
if(IIC_OVERRUN_ERROR(CMSDK_I2C0) == true)
|
||
{
|
||
printf("IIC_OVERRUN_ERROR\n");
|
||
return ;
|
||
}
|
||
|
||
}
|
||
|
||
|
||
void I2C1_Event_Handler(void)
|
||
{
|
||
NVIC_ClearPendingIRQ(I2C1_Event_IRQn);
|
||
if(IIC_MASTER_MODE(CMSDK_I2C1) == TRUE)
|
||
{
|
||
if(IIC_SB_EVENT(CMSDK_I2C1) == true )
|
||
{
|
||
return ;
|
||
}
|
||
|
||
if(IIC_ADDR_EVENT(CMSDK_I2C1) == true )
|
||
{
|
||
return;
|
||
}
|
||
|
||
if(IIC_ADD10_EVENT(CMSDK_I2C1) == true)
|
||
{
|
||
return;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(IIC_ADDR_EVENT(CMSDK_I2C1) == true) //作为从机,进入此处则地址匹配!
|
||
{
|
||
return ;
|
||
}
|
||
|
||
if(IIC_STOPF_EVENT(CMSDK_I2C1) == true) //作为从机,接收到STOP信号
|
||
{
|
||
printf("get stop\n");
|
||
//如果不再接收,则关闭IIC!!!
|
||
IIC_Cmd(CMSDK_I2C1 ,DISABLE) ;
|
||
CMSDK_I2C1->I2C_CR2|=(1<<7); //中断使能--bit8:buffer中断 / bit7:事件中断 / bit6:错误中断
|
||
CMSDK_I2C1->I2C_CR1|=(1);
|
||
CMSDK_I2C1->I2C_OAR = 0X78 ;
|
||
CMSDK_I2C1->I2C_CR1 |= (1<<5);
|
||
IIC_Cmd(CMSDK_I2C1 ,ENABLE) ;
|
||
IIC_ITConfig(CMSDK_I2C0,0 ,DISABLE);
|
||
IIC_ITConfig(CMSDK_I2C0,0 ,ENABLE);
|
||
return ;
|
||
}
|
||
}
|
||
if(IIC_BTF_EVENT(CMSDK_I2C1) == true)
|
||
{
|
||
|
||
}
|
||
if((IIC_RxNE_EVENT(CMSDK_I2C1) == true)) //作为从机,buffer非空,读IIC_DR中的数据
|
||
{
|
||
uint8_t read_data = (uint8_t)(CMSDK_I2C1->I2C_DR & 0xff);
|
||
printf("%d\n", read_data);
|
||
}
|
||
if(IIC_TxE_EVENT(CMSDK_I2C1) == true)
|
||
{
|
||
|
||
}
|
||
return ;
|
||
}
|
||
|
||
void I2C1_Error_Handler(void)
|
||
{
|
||
NVIC_ClearPendingIRQ(I2C1_Error_IRQn);
|
||
|
||
if(IIC_BUS_ERROR(CMSDK_I2C1) == true)
|
||
{
|
||
printf("bus error\n");
|
||
return ;
|
||
}
|
||
|
||
if(IIC_ACK_ERROR(CMSDK_I2C1) == true)
|
||
{
|
||
printf("IIC_ACK_ERROR\n");
|
||
return ;
|
||
}
|
||
|
||
if(IIC_ARBITRAT_ERROR(CMSDK_I2C1) == true)
|
||
{
|
||
printf("IIC_ARBITRAT_ERROR\n");
|
||
return ;
|
||
}
|
||
|
||
if(IIC_OVERRUN_ERROR(CMSDK_I2C1) == true)
|
||
{
|
||
printf("IIC_OVERRUN_ERROR\n");
|
||
return ;
|
||
}
|
||
|
||
}
|
||
|