Electricity/FWLIB/source/ENS1_IIC.c

362 lines
8.1 KiB
C
Raw Normal View History

/*
*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: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#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 <20>жϣ<D0B6>ITERRENʹ<4E>ܣ<EFBFBD>
bool IIC_BUS_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 8)&0x1) ? true :false);}
//Ӧ<><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
bool IIC_ACK_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 10)&0x1) ? true :false);}
//<2F>ٲ<EFBFBD>
bool IIC_ARBITRAT_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 9)&0x1) ? true :false);}
//<2F><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool IIC_OVERRUN_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 11)&0x1) ? true :false);}
//ITEVFENʹ<4E>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
//<2F><>ʼ״̬<D7B4><CCAC><EFBFBD><EFBFBD>ʼλ<CABC><CEBB><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>
bool IIC_SB_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS)&0x1) ? true :false);}
//<2F><>ַ<EFBFBD><D6B7><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD> / <20><>ַƥ<D6B7><EFBFBD>ӻ<EFBFBD><D3BB>¼<EFBFBD><C2BC><EFBFBD>
bool IIC_ADDR_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 1)&0x1) ? true :false);}
//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѷ<EFBFBD><D1B7><EFBFBD>10bit<69><74>ַ<EFBFBD><D6B7><EFBFBD>ݵĵ<DDB5>һ<EFBFBD><D2BB><EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD><EFBFBD>
bool IIC_ADD10_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 3)&0x1) ? true :false);}
//<2F>ӻ<EFBFBD>ģʽ<C4A3>£<EFBFBD>ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>
bool IIC_STOPF_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 4)&0x1) ? true :false);}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ֽڴ<D6BD><DAB4><EFBFBD><EFBFBD>ɹ<EFBFBD>
bool IIC_BTF_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 2)&0x1) ? true :false);}
//ITEVFEN <20><> ITBUFEN ʹ<>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
//<2F><><EFBFBD>ݼĴ<DDBC><C4B4><EFBFBD><EFBFBD>ǿգ<C7BF><D5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
bool IIC_RxNE_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 5)&0x1) ? true :false);}
//<2F><><EFBFBD>ݼĴ<DDBC><C4B4><EFBFBD><EFBFBD>գ<EFBFBD><D5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
bool IIC_TxE_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 6)&0x1) ? true :false);}
//<2F><><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>æ<EFBFBD><C3A6><EFBFBD><EFBFBD>
uint8_t IIC_Bus_BUSY(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (uint8_t)(((CMSDK_I2Cx->I2C_STS >> 13)&0x1) ? 1 :0);};
//ģʽȷ<CABD><C8B7>
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);//<2F>ж<EFBFBD>ʹ<EFBFBD><CAB9>--bit8<74><38>buffer<65>ж<EFBFBD> / bit7<74><37><EFBFBD>¼<EFBFBD><C2BC>ж<EFBFBD> / bit6<74><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
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:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>
IIC_CR1:ʹ<EFBFBD><EFBFBD>IIC<EFBFBD>ӿ<EFBFBD>
IIC_CR1:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>START λ IIC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
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) //ʹ<><CAB9>IIC<49><43><EFBFBD><EFBFBD>
{
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 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD>豸ͬ<E8B1B8><CDAC>
//<2F><><EFBFBD>豸ͨ<E8B1B8><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߷<EFBFBD><DFB7><EFBFBD>0x00<30><30>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>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); //<2F>ֽڴ<D6BD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
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)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD>գ<EFBFBD><D5A3><EFBFBD><EFBFBD>ر<EFBFBD>IIC!!!
IIC_Cmd(CMSDK_I2C0 ,DISABLE) ;
CMSDK_I2C0->I2C_CR2|=(1<<7); //<2F>ж<EFBFBD>ʹ<EFBFBD><CAB9>--bit8<74><38>buffer<65>ж<EFBFBD> / bit7<74><37><EFBFBD>¼<EFBFBD><C2BC>ж<EFBFBD> / bit6<74><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
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) //<2F><>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˴<EFBFBD><CBB4><EFBFBD><EFBFBD><EFBFBD>ַƥ<D6B7>
{
return ;
}
if(IIC_STOPF_EVENT(CMSDK_I2C1) == true) //<2F><>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>STOP<4F>ź<EFBFBD>
{
printf("get stop\n");
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD>գ<EFBFBD><D5A3><EFBFBD><EFBFBD>ر<EFBFBD>IIC!!!
IIC_Cmd(CMSDK_I2C1 ,DISABLE) ;
CMSDK_I2C1->I2C_CR2|=(1<<7); //<2F>ж<EFBFBD>ʹ<EFBFBD><CAB9>--bit8<74><38>buffer<65>ж<EFBFBD> / bit7<74><37><EFBFBD>¼<EFBFBD><C2BC>ж<EFBFBD> / bit6<74><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
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)) //<2F><>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD>buffer<65>ǿգ<C7BF><D5A3><EFBFBD>IIC_DR<44>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
{
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 ;
}
}