Electricity/FWLIB/source/ENS1_IIC.c

351 lines
8.6 KiB
C
Raw 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.C
*Author:
*Version: V1.0
*Date: 2023-11-
*Description:
*Function List:
History:
1.V1.0
Date:
Author:
Modification: <20><><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>
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>/<2F><><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>
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>
//<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>
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:<3A><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1>Ƶ<EFBFBD><C6B5>
IIC_CR1:ʹ<><CAB9>IIC<49>ӿ<EFBFBD>
IIC_CR1:<3A><><EFBFBD><EFBFBD>START λ IIC<49><43><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>
}
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><D9BD>գ<EFBFBD><D5A3><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);
}
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)
{
return ;
}
if(IIC_ACK_ERROR(CMSDK_I2C0) == true)
{
return ;
}
if(IIC_ARBITRAT_ERROR(CMSDK_I2C0) == true)
{
return ;
}
if(IIC_OVERRUN_ERROR(CMSDK_I2C0) == true)
{
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><CBB4><EFBFBD><EFBFBD>ַƥ<D6B7>
{
return ;
}
if(IIC_STOPF_EVENT(CMSDK_I2C1) == true) //<2F><>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>STOP<4F>ź<EFBFBD>
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD>գ<EFBFBD><D5A3><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);
}
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)
{
return ;
}
if(IIC_ACK_ERROR(CMSDK_I2C1) == true)
{
return ;
}
if(IIC_ARBITRAT_ERROR(CMSDK_I2C1) == true)
{
return ;
}
if(IIC_OVERRUN_ERROR(CMSDK_I2C1) == true)
{
return ;
}
}