|
|
|
|
#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();
|
|
|
|
|
}
|
|
|
|
|
}
|