You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

264 lines
6.2 KiB
C

#include "SWM221.h"
#include "IOI2C_SLV.h"
static char TxBuff[128] = {0};
static uint32_t TxSize = 0;
static volatile uint32_t TxIndx = 0;
static char RxBuff[128] = {0};
static uint32_t RxSize = 128; //<2F><><EFBFBD><EFBFBD><EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD>128<32><38><EFBFBD>ֽ<EFBFBD>
static volatile uint32_t RxIndx = 0;
static volatile uint32_t BitTim = 0;
static volatile uint32_t IsBusy = 0; //<2F><><EFBFBD>⵽Start<72><74>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>⵽Stop<6F><70><EFBFBD><EFBFBD>
static volatile uint32_t IsNACK = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>յ<EFBFBD>NACK
static uint32_t RxBuff2[128] = {0}; //<2F><><EFBFBD>յ<EFBFBD>Stopʱ<70><CAB1>RxBuff<66><66><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>Ȼ<EFA3AC><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>RxBuff<66><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>RxBuff2<66>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static volatile uint32_t RxSize2 = 0; //RxBuff2<66><32><EFBFBD>ж<EFBFBD><D0B6>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD>
static volatile uint32_t RxIndx2 = 0;
static void (*IOI2C_SLV_Func)(void);
static void IOI2C_SLV_SendByte(void);
static void IOI2C_SLV_ReadByte(void);
extern uint32_t IOI2C_SLV_EmptyCallback(char *TxBuff);
/******************************************************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: IOI2C_SLV_Init()
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>: IOI2C_SLV<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
******************************************************************************************************************************************/
void IOI2C_SLV_Init(void)
{
#define IOI2C_PORT GPIOA
#define IOI2C_SCL PIN2
#define IOI2C_SDA PIN3
#define IOI2C_IRQ GPIOA_IRQn
#define IOI2C_ISR GPIOA_Handler
GPIO_Init(IOI2C_PORT, IOI2C_SCL, 0, 1, 0, 1);
#define I2C_SCL_Value() GPIO_GetBit(IOI2C_PORT, IOI2C_SCL)
GPIO_Init(IOI2C_PORT, IOI2C_SDA, 0, 1, 0, 1);
#define I2C_SDA_OUTPUT() IOI2C_PORT->DIR |= (1 << IOI2C_SDA);
#define I2C_SDA_LOW() GPIO_ClrBit(IOI2C_PORT, IOI2C_SDA)
#define I2C_SDA_HIGH() GPIO_SetBit(IOI2C_PORT, IOI2C_SDA)
#define I2C_SDA_INPUT() IOI2C_PORT->DIR &=~(1 << IOI2C_SDA)
#define I2C_SDA_Value() GPIO_GetBit(IOI2C_PORT, IOI2C_SDA)
EXTI_Init(IOI2C_PORT, IOI2C_SCL, EXTI_BOTH_EDGE);
EXTI_Init(IOI2C_PORT, IOI2C_SDA, EXTI_BOTH_EDGE);
NVIC_EnableIRQ(IOI2C_IRQ);
EXTI_Open(IOI2C_PORT, IOI2C_SCL);
EXTI_Open(IOI2C_PORT, IOI2C_SDA);
}
/******************************************************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: IOI2C_SLV_RxNotEmpty()
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>: IOI2C<EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD>ȡ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: uint32_t 0 û<EFBFBD>п<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> >0 <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><EFBFBD><EFBFBD>
* ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
******************************************************************************************************************************************/
uint32_t IOI2C_SLV_RxNotEmpty(void)
{
return RxSize2;
}
/******************************************************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: IOI2C_SLV_FetchByte()
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>IOI2C<EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: char ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
* ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
******************************************************************************************************************************************/
char IOI2C_SLV_FetchByte(void)
{
RxSize2 -= 1;
return RxBuff2[RxIndx2++];
}
/******************************************************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: IOI2C_SLV_FetchBytes()
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>IOI2C<EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>n<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: char buff[] ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* uint32_t len Ҫȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><EFBFBD><EFBFBD>IOI2C_SLV_RxNotEmpty()<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
******************************************************************************************************************************************/
void IOI2C_SLV_FetchBytes(char buff[], uint32_t len)
{
uint32_t i;
for(i = 0; i < len; i++)
buff[i] = RxBuff2[RxIndx2+i];
RxIndx2 += len;
RxSize2 -= len;
}
static void IOI2C_SLV_SendByte(void)
{
if(IsNACK == 1)
{
I2C_SDA_INPUT();
goto noinc;
}
if(TxSize == 0)
{
TxSize = IOI2C_SLV_EmptyCallback(TxBuff);
TxIndx = 0;
}
if(BitTim == 0) I2C_SDA_OUTPUT(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD>ʱ<EFBFBD>ὫSDA<44>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD>ACK
if(BitTim < 16)
{
if((BitTim % 2) == 0)
{
if(TxBuff[TxIndx] & (1 << (7 - BitTim/2)))
I2C_SDA_HIGH();
else
I2C_SDA_LOW();
}
}
else if(BitTim == 16)
{
I2C_SDA_INPUT();
}
else if(BitTim == 17)
{
if(I2C_SDA_Value()) //NACK
{
IsNACK = 1;
}
else
{
if(++TxIndx == TxSize)
{
TxIndx = TxSize - 1;
}
}
BitTim = 0;
goto noinc;
}
BitTim++;
noinc:
;
}
static void IOI2C_SLV_ReadByte(void)
{
if(BitTim == 0) I2C_SDA_INPUT(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD>ʱ<EFBFBD>ὫSDA<44>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>ACK
if(BitTim < 16)
{
if((BitTim % 2) == 1)
{
if(I2C_SDA_Value() == 1)
RxBuff[RxIndx] |= (1 << (7 - BitTim/2));
else
RxBuff[RxIndx] &= ~(1 << (7 - BitTim/2));
}
}
else if(BitTim == 16)
{
I2C_SDA_OUTPUT();
if(++RxIndx < RxSize)
{
I2C_SDA_LOW();
}
else
{
I2C_SDA_HIGH();
}
}
else if(BitTim == 17)
{
if((RxIndx == 1) && (RxBuff[0] & 0x01))
{
TxIndx = 0;
IsNACK = 0;
IOI2C_SLV_Func = IOI2C_SLV_SendByte;
}
BitTim = 0;
goto noinc;
}
BitTim++;
noinc:
;
}
/******************************************************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: IOI2C_ISR()
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>: IOI2C SCL<EFBFBD><EFBFBD>SDA<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˫<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
******************************************************************************************************************************************/
void IOI2C_ISR(void)
{
uint32_t i;
if(EXTI_State(IOI2C_PORT, IOI2C_SDA))
{
EXTI_Clear(IOI2C_PORT, IOI2C_SDA);
if(I2C_SCL_Value() == 1) //ֻ<><D6BB><EFBFBD><EFBFBD>SCL<43>ߵ<EFBFBD>ƽʱSDA<44><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Start<72><74>Stop
{
if(I2C_SDA_Value() == 0) //Start
{
RxIndx = 0;
BitTim = 0;
IsBusy = 1;
IOI2C_SLV_Func = IOI2C_SLV_ReadByte;
}
else //Stop
{
IsBusy = 0;
for(i = 0; i < RxIndx-1; i++)
{
RxBuff2[i] = RxBuff[1+i]; //RxBuff[]<5D>е<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD><D6BD>Ǵӻ<C7B4><D3BB><EFBFBD>ַ
}
RxSize2 = i;
RxIndx2 = 0;
}
}
}
else if(EXTI_State(IOI2C_PORT, IOI2C_SCL))
{
EXTI_Clear(IOI2C_PORT, IOI2C_SCL);
if(IsBusy) IOI2C_SLV_Func();
}
}