test in progress
This commit is contained in:
764
Core/SWI2C/i2c_sw.c
Normal file
764
Core/SWI2C/i2c_sw.c
Normal file
@ -0,0 +1,764 @@
|
||||
#include "i2c_sw.h"
|
||||
|
||||
|
||||
#define SW_I2C_WAIT_TIME 22
|
||||
|
||||
|
||||
#define I2C_READ 0x01
|
||||
#define READ_CMD 1
|
||||
#define WRITE_CMD 0
|
||||
|
||||
#define SW_I2C1_SCL_GPIO GPIO_SW_I2C1_SCL
|
||||
#define SW_I2C1_SDA_GPIO GPIO_SW_I2C1_SDA
|
||||
#define SW_I2C1_SCL_PIN GPIO_SW_I2C1_SCL_PIN
|
||||
#define SW_I2C1_SDA_PIN GPIO_SW_I2C1_SDA_PIN
|
||||
/*
|
||||
#define SW_I2Cx_SCL_GPIO GPIO_SW_I2Cx_SCL
|
||||
#define SW_I2Cx_SDA_GPIO GPIO_SW_I2Cx_SDA
|
||||
#define SW_I2Cx_SCL_PIN GPIO_SW_I2Cx_SCL_PIN
|
||||
#define SW_I2Cx_SDA_PIN GPIO_SW_I2Cx_SDA_PIN
|
||||
*/
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#endif
|
||||
#ifndef FALSE
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
||||
void TIMER__Wait_us(__IO uint32_t nCount)
|
||||
{
|
||||
for (; nCount != 0;nCount--);
|
||||
}
|
||||
|
||||
|
||||
/* //Systick功能实现us延时,参数SYSCLK为系统时钟
|
||||
#define AHB_INPUT 64 //请按RCC中设置的AHB时钟频率填写到这里(单位MHz)
|
||||
|
||||
void TIMER__Wait_us(__IO uint32_t uS) //uS微秒级延时程序(参考值即是延时数,72MHz时最大值233015)
|
||||
{
|
||||
uint32_t temp;
|
||||
SysTick->LOAD=AHB_INPUT*uS; //重装计数初值(当主频是72MHz,72次为1微秒)
|
||||
SysTick->VAL=0x00; //清空定时器的计数器
|
||||
SysTick->CTRL=0x00000005; //内部时钟FCLK,打开定时器
|
||||
do
|
||||
{
|
||||
temp=SysTick->CTRL;
|
||||
}
|
||||
while(temp&0x01&&!(temp&(1<<16))); //等待时间到达
|
||||
SysTick->CTRL=0x00000004; //关闭定时器
|
||||
SysTick->VAL=0x00; //清空定时器的计数器
|
||||
} */
|
||||
|
||||
|
||||
void SW_I2C_initial(void)
|
||||
{
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
|
||||
GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH;
|
||||
GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP;
|
||||
|
||||
GPIO_InitStructure.Pin = GPIO_SW_I2C1_SCL_PIN;
|
||||
HAL_GPIO_Init(GPIO_SW_I2C1_SCL, &GPIO_InitStructure);
|
||||
GPIO_InitStructure.Pin = GPIO_SW_I2C1_SDA_PIN;
|
||||
HAL_GPIO_Init(GPIO_SW_I2C1_SDA, &GPIO_InitStructure);
|
||||
|
||||
/*
|
||||
GPIO_InitStructure.Pin = GPIO_SW_I2Cx_SCL_PIN;
|
||||
HAL_GPIO_Init(GPIO_SW_I2Cx_SCL, &GPIO_InitStructure);
|
||||
GPIO_InitStructure.Pin = GPIO_SW_I2Cx_SDA_PIN;
|
||||
HAL_GPIO_Init(GPIO_SW_I2Cx_SDA, &GPIO_InitStructure);
|
||||
*/
|
||||
|
||||
|
||||
}
|
||||
|
||||
void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
|
||||
{
|
||||
HAL_GPIO_WritePin(GPIOx,GPIO_Pin,GPIO_PIN_SET);
|
||||
}
|
||||
|
||||
void GPIO_ResetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
|
||||
{
|
||||
HAL_GPIO_WritePin(GPIOx,GPIO_Pin,GPIO_PIN_RESET);
|
||||
}
|
||||
|
||||
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
|
||||
{
|
||||
uint8_t Ret;
|
||||
Ret=(uint16_t)HAL_GPIO_ReadPin(GPIOx,GPIO_Pin);
|
||||
return Ret;
|
||||
}
|
||||
|
||||
void sda_high(uint8_t sel)
|
||||
{
|
||||
if(sel == 1)
|
||||
GPIO_SetBits(SW_I2C1_SDA_GPIO, SW_I2C1_SDA_PIN);
|
||||
//else if(sel==x) ...
|
||||
}
|
||||
|
||||
|
||||
void sda_low(uint8_t sel)
|
||||
{
|
||||
if(sel == 1)
|
||||
GPIO_ResetBits(SW_I2C1_SDA_GPIO, SW_I2C1_SDA_PIN);
|
||||
//else if(sel==x) ...
|
||||
}
|
||||
|
||||
|
||||
void scl_high(uint8_t sel)
|
||||
{
|
||||
if(sel == 1)
|
||||
GPIO_SetBits(SW_I2C1_SCL_GPIO, SW_I2C1_SCL_PIN);
|
||||
//else if(sel==x) ...
|
||||
}
|
||||
|
||||
|
||||
void scl_low(uint8_t sel)
|
||||
{
|
||||
if(sel == 1)
|
||||
GPIO_ResetBits(SW_I2C1_SCL_GPIO, SW_I2C1_SCL_PIN);
|
||||
//else if(sel==x) ...
|
||||
}
|
||||
|
||||
void sda_out(uint8_t sel, uint8_t out)
|
||||
{
|
||||
if (out)
|
||||
{
|
||||
sda_high(sel);
|
||||
}
|
||||
else
|
||||
{
|
||||
sda_low(sel);
|
||||
}
|
||||
}
|
||||
|
||||
void sda_in_mode(uint8_t sel)
|
||||
{
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
|
||||
GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH;
|
||||
GPIO_InitStructure.Mode=GPIO_MODE_INPUT;
|
||||
|
||||
if(sel == 1)
|
||||
{
|
||||
GPIO_InitStructure.Pin = SW_I2C1_SDA_PIN;
|
||||
HAL_GPIO_Init(SW_I2C1_SDA_GPIO, &GPIO_InitStructure);
|
||||
}
|
||||
//else if(sel==x) ...
|
||||
|
||||
}
|
||||
|
||||
void sda_out_mode(uint8_t sel)
|
||||
{
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
|
||||
GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH;
|
||||
GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_OD;
|
||||
|
||||
if(sel == 1)
|
||||
{
|
||||
GPIO_InitStructure.Pin = SW_I2C1_SDA_PIN;
|
||||
HAL_GPIO_Init(SW_I2C1_SDA_GPIO, &GPIO_InitStructure);
|
||||
}
|
||||
//else if(sel==x) ...
|
||||
}
|
||||
|
||||
void scl_in_mode(uint8_t sel)
|
||||
{
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
|
||||
GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH;
|
||||
GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_OD;
|
||||
|
||||
if(sel == 1)
|
||||
{
|
||||
GPIO_InitStructure.Pin = SW_I2C1_SCL_PIN;
|
||||
HAL_GPIO_Init(SW_I2C1_SCL_GPIO, &GPIO_InitStructure);
|
||||
}
|
||||
//else if(sel==x) ...
|
||||
}
|
||||
|
||||
void scl_out_mode(uint8_t sel)
|
||||
{
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
|
||||
GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH;
|
||||
GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_OD;
|
||||
|
||||
if(sel == 1)
|
||||
{
|
||||
GPIO_InitStructure.Pin = SW_I2C1_SCL_PIN;
|
||||
HAL_GPIO_Init(SW_I2C1_SCL_GPIO, &GPIO_InitStructure);
|
||||
}
|
||||
//else if(sel==x) ...
|
||||
}
|
||||
|
||||
void i2c_clk_data_out(uint8_t sel)
|
||||
{
|
||||
scl_high(sel);
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
scl_low(sel);
|
||||
|
||||
}
|
||||
|
||||
void i2c_port_initial(uint8_t sel)
|
||||
{
|
||||
sda_high(sel);
|
||||
scl_high(sel);
|
||||
}
|
||||
|
||||
void i2c_start_condition(uint8_t sel)
|
||||
{
|
||||
sda_high(sel);
|
||||
scl_high(sel);
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
sda_low(sel);
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
scl_low(sel);
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME << 1);
|
||||
}
|
||||
|
||||
void i2c_stop_condition(uint8_t sel)
|
||||
{
|
||||
sda_low(sel);
|
||||
scl_high(sel);
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
sda_high(sel);
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
}
|
||||
|
||||
uint8_t i2c_check_ack(uint8_t sel)
|
||||
{
|
||||
uint8_t ack;
|
||||
int i;
|
||||
unsigned int temp;
|
||||
|
||||
sda_in_mode(sel);
|
||||
|
||||
scl_high(sel);
|
||||
|
||||
ack = 0;
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
|
||||
for (i = 10; i > 0; i--)
|
||||
{
|
||||
temp = !(SW_I2C_ReadVal_SDA(sel));
|
||||
if (temp)
|
||||
{
|
||||
ack = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
scl_low(sel);
|
||||
sda_out_mode(sel);
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
return ack;
|
||||
}
|
||||
|
||||
void i2c_check_not_ack(uint8_t sel)
|
||||
{
|
||||
sda_in_mode(sel);
|
||||
i2c_clk_data_out(sel);
|
||||
sda_out_mode(sel);
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
}
|
||||
|
||||
void i2c_check_not_ack_continue(uint8_t sel)
|
||||
{
|
||||
|
||||
i2c_clk_data_out(sel);
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
}
|
||||
|
||||
void i2c_slave_address(uint8_t sel, uint8_t IICID, uint8_t readwrite)
|
||||
{
|
||||
int x;
|
||||
|
||||
if (readwrite)
|
||||
{
|
||||
IICID |= I2C_READ;
|
||||
//printf("%d",IICID);
|
||||
}
|
||||
else
|
||||
{
|
||||
IICID &= ~I2C_READ;
|
||||
//printf("%d",IICID);
|
||||
}
|
||||
|
||||
scl_low(sel);
|
||||
|
||||
for (x = 7; x >= 0; x--)
|
||||
{
|
||||
sda_out(sel, IICID & (1 << x));
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
i2c_clk_data_out(sel);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void i2c_register_address(uint8_t sel, uint8_t addr)
|
||||
{
|
||||
int x;
|
||||
|
||||
scl_low(sel);
|
||||
|
||||
for (x = 7; x >= 0; x--)
|
||||
{
|
||||
sda_out(sel, addr & (1 << x));
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
i2c_clk_data_out(sel);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void i2c_send_ack(uint8_t sel)
|
||||
{
|
||||
sda_out_mode(sel);
|
||||
sda_low(sel);
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
scl_high(sel);
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME << 1);
|
||||
|
||||
sda_low(sel);
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME << 1);
|
||||
|
||||
scl_low(sel);
|
||||
|
||||
sda_out_mode(sel);
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
}
|
||||
|
||||
|
||||
uint8_t SW_I2C_ReadVal_SDA(uint8_t sel)
|
||||
{
|
||||
if(sel == 1)
|
||||
return GPIO_ReadInputDataBit(SW_I2C1_SDA_GPIO, SW_I2C1_SDA_PIN);
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8_t SW_I2C_ReadVal_SCL(uint8_t sel)
|
||||
{
|
||||
if(sel == 1)
|
||||
return GPIO_ReadInputDataBit(SW_I2C1_SCL_GPIO, SW_I2C1_SCL_PIN);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SW_I2C_Write_Data(uint8_t sel, uint8_t data)
|
||||
{
|
||||
int x;
|
||||
|
||||
scl_low(sel);
|
||||
|
||||
for (x = 7; x >= 0; x--)
|
||||
{
|
||||
sda_out(sel, data & (1 << x));
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
i2c_clk_data_out(sel);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t SW_I2C_Read_Data(uint8_t sel)
|
||||
{
|
||||
int x;
|
||||
uint8_t readdata = 0;
|
||||
|
||||
sda_in_mode(sel);
|
||||
|
||||
for (x = 8; x--;)
|
||||
{
|
||||
scl_high(sel);
|
||||
|
||||
readdata <<= 1;
|
||||
if (SW_I2C_ReadVal_SDA(sel))
|
||||
readdata |= 0x01;
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
scl_low(sel);
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
}
|
||||
|
||||
sda_out_mode(sel);
|
||||
return readdata;
|
||||
}
|
||||
|
||||
uint8_t SW_I2C_WriteControl_8Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint8_t data)
|
||||
{
|
||||
uint8_t returnack = TRUE;
|
||||
|
||||
i2c_start_condition(sel);
|
||||
|
||||
i2c_slave_address(sel, IICID, WRITE_CMD);
|
||||
if (!i2c_check_ack(sel))
|
||||
{
|
||||
returnack = FALSE;
|
||||
}
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
|
||||
i2c_register_address(sel, regaddr);
|
||||
if (!i2c_check_ack(sel))
|
||||
{
|
||||
returnack = FALSE;
|
||||
}
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
|
||||
SW_I2C_Write_Data(sel, data);
|
||||
if (!i2c_check_ack(sel))
|
||||
{
|
||||
returnack = FALSE;
|
||||
}
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
|
||||
i2c_stop_condition(sel);
|
||||
|
||||
return returnack;
|
||||
}
|
||||
|
||||
uint8_t SW_I2C_WriteControl_8Bit_OnlyRegAddr(uint8_t sel, uint8_t IICID, uint8_t regaddr)
|
||||
{
|
||||
uint8_t returnack = TRUE;
|
||||
|
||||
i2c_start_condition(sel);
|
||||
|
||||
i2c_slave_address(sel, IICID, WRITE_CMD);
|
||||
if (!i2c_check_ack(sel))
|
||||
{
|
||||
returnack = FALSE;
|
||||
}
|
||||
|
||||
i2c_register_address(sel, regaddr);
|
||||
if (!i2c_check_ack(sel))
|
||||
{
|
||||
returnack = FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
return returnack;
|
||||
}
|
||||
|
||||
uint8_t SW_I2C_WriteControl_16Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint16_t data)
|
||||
{
|
||||
uint8_t returnack = TRUE;
|
||||
|
||||
i2c_start_condition(sel);
|
||||
|
||||
i2c_slave_address(sel, IICID, WRITE_CMD);
|
||||
if (!i2c_check_ack(sel))
|
||||
{
|
||||
returnack = FALSE;
|
||||
}
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
|
||||
i2c_register_address(sel, regaddr);
|
||||
if (!i2c_check_ack(sel))
|
||||
{
|
||||
returnack = FALSE;
|
||||
}
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
|
||||
SW_I2C_Write_Data(sel, (data >> 8) & 0xFF);
|
||||
if (!i2c_check_ack(sel))
|
||||
{
|
||||
returnack = FALSE;
|
||||
}
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
|
||||
SW_I2C_Write_Data(sel, data & 0xFF);
|
||||
if (!i2c_check_ack(sel))
|
||||
{
|
||||
returnack = FALSE;
|
||||
}
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
|
||||
i2c_stop_condition(sel);
|
||||
|
||||
return returnack;
|
||||
}
|
||||
|
||||
uint8_t SW_I2C_ReadControl_8Bit_OnlyRegAddr(uint8_t sel, uint8_t IICID, uint8_t regaddr)
|
||||
{
|
||||
uint8_t returnack = TRUE;
|
||||
|
||||
i2c_start_condition(sel);
|
||||
|
||||
i2c_slave_address(sel, IICID, WRITE_CMD);
|
||||
if (!i2c_check_ack(sel))
|
||||
{
|
||||
returnack = FALSE;
|
||||
}
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
|
||||
i2c_register_address(sel, regaddr);
|
||||
if (!i2c_check_ack(sel))
|
||||
{
|
||||
returnack = FALSE;
|
||||
}
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
|
||||
i2c_stop_condition(sel);
|
||||
|
||||
return returnack;
|
||||
}
|
||||
|
||||
uint8_t SW_I2C_ReadControl_8Bit_OnlyData(uint8_t sel, uint8_t IICID)
|
||||
{
|
||||
uint8_t readdata = 0;
|
||||
|
||||
i2c_port_initial(sel);
|
||||
|
||||
i2c_start_condition(sel);
|
||||
|
||||
i2c_slave_address(sel, IICID, READ_CMD);
|
||||
i2c_check_ack(sel);
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
|
||||
readdata = SW_I2C_Read_Data(sel);
|
||||
|
||||
i2c_check_not_ack(sel);
|
||||
|
||||
i2c_stop_condition(sel);
|
||||
|
||||
return readdata;
|
||||
}
|
||||
|
||||
uint16_t SW_I2C_ReadControl_16Bit_OnlyData(uint8_t sel, uint8_t IICID)
|
||||
{
|
||||
uint8_t readimsi = 0;
|
||||
uint16_t readdata = 0;
|
||||
|
||||
i2c_start_condition(sel);
|
||||
|
||||
i2c_slave_address(sel, IICID, READ_CMD);
|
||||
i2c_check_not_ack(sel);
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
|
||||
readimsi = SW_I2C_Read_Data(sel);
|
||||
i2c_check_not_ack_continue(sel);
|
||||
|
||||
readdata = readimsi<<8;
|
||||
|
||||
readimsi = SW_I2C_Read_Data(sel);
|
||||
i2c_check_not_ack(sel);
|
||||
|
||||
|
||||
readdata |= readimsi;
|
||||
|
||||
i2c_stop_condition(sel);
|
||||
|
||||
return readdata;
|
||||
}
|
||||
|
||||
uint8_t SW_I2C_ReadControl_8Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr)
|
||||
{
|
||||
uint8_t readdata = 0;
|
||||
|
||||
i2c_port_initial(sel);
|
||||
|
||||
i2c_start_condition(sel);
|
||||
|
||||
i2c_slave_address(sel, IICID, WRITE_CMD);
|
||||
i2c_check_ack(sel);
|
||||
|
||||
i2c_register_address(sel, regaddr);
|
||||
i2c_check_ack(sel);
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
|
||||
i2c_start_condition(sel);
|
||||
|
||||
i2c_slave_address(sel, IICID, READ_CMD);
|
||||
i2c_check_ack(sel);
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
|
||||
readdata = SW_I2C_Read_Data(sel);
|
||||
|
||||
i2c_check_not_ack(sel);
|
||||
|
||||
//i2c_stop_condition(sel);
|
||||
i2c_start_condition(sel);
|
||||
|
||||
return readdata;
|
||||
}
|
||||
|
||||
uint16_t SW_I2C_ReadControl_16Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr)
|
||||
{
|
||||
uint16_t readdata = 0;
|
||||
|
||||
i2c_port_initial(sel);
|
||||
|
||||
i2c_start_condition(sel);
|
||||
|
||||
i2c_slave_address(sel, IICID, WRITE_CMD);
|
||||
i2c_check_ack(sel);
|
||||
|
||||
i2c_register_address(sel, regaddr);
|
||||
i2c_check_ack(sel);
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
|
||||
i2c_start_condition(sel);
|
||||
|
||||
i2c_slave_address(sel, IICID, READ_CMD);
|
||||
i2c_check_ack(sel);
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
|
||||
readdata = SW_I2C_Read_Data(sel);
|
||||
i2c_send_ack(sel);
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
|
||||
readdata = ((readdata << 8) | SW_I2C_Read_Data(sel));
|
||||
|
||||
i2c_check_not_ack(sel);
|
||||
|
||||
i2c_stop_condition(sel);
|
||||
|
||||
i2c_start_condition(sel); //TODO
|
||||
i2c_slave_address(sel, IICID, WRITE_CMD);
|
||||
i2c_check_ack(sel);
|
||||
i2c_stop_condition(sel);
|
||||
|
||||
return readdata;
|
||||
}
|
||||
|
||||
uint8_t SW_I2C_ReadnControl_8Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint8_t rcnt, uint8_t (*pdata))
|
||||
{
|
||||
uint8_t returnack = TRUE;
|
||||
uint8_t index;
|
||||
|
||||
i2c_port_initial(sel);
|
||||
|
||||
i2c_start_condition(sel);
|
||||
|
||||
i2c_slave_address(sel, IICID, WRITE_CMD);
|
||||
if (!i2c_check_ack(sel)) { returnack = FALSE; }
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
|
||||
i2c_register_address(sel, regaddr);
|
||||
if (!i2c_check_ack(sel)) { returnack = FALSE; }
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
|
||||
i2c_start_condition(sel);
|
||||
|
||||
i2c_slave_address(sel, IICID, READ_CMD);
|
||||
if (!i2c_check_ack(sel)) { returnack = FALSE; }
|
||||
|
||||
for ( index = 0 ; index < rcnt ; index++){
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
pdata[index] = SW_I2C_Read_Data(sel);
|
||||
}
|
||||
|
||||
pdata[rcnt-1] = SW_I2C_Read_Data(sel);
|
||||
|
||||
i2c_check_not_ack(sel);
|
||||
|
||||
i2c_stop_condition(sel);
|
||||
|
||||
i2c_start_condition(sel); //TODO
|
||||
i2c_slave_address(sel, IICID, WRITE_CMD);
|
||||
i2c_check_ack(sel);
|
||||
i2c_stop_condition(sel);
|
||||
|
||||
return returnack;
|
||||
}
|
||||
|
||||
uint8_t SW_I2C_Multi_ReadnControl_8Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint8_t rcnt, uint8_t (*pdata))
|
||||
{
|
||||
uint8_t returnack = TRUE;
|
||||
uint8_t index;
|
||||
|
||||
i2c_port_initial(sel);
|
||||
|
||||
i2c_start_condition(sel);
|
||||
|
||||
i2c_slave_address(sel, IICID, WRITE_CMD);
|
||||
if (!i2c_check_ack(sel)) { returnack = FALSE; }
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
|
||||
i2c_register_address(sel, regaddr);
|
||||
if (!i2c_check_ack(sel)) { returnack = FALSE; }
|
||||
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
|
||||
i2c_start_condition(sel);
|
||||
|
||||
i2c_slave_address(sel, IICID, READ_CMD);
|
||||
if (!i2c_check_ack(sel)) { returnack = FALSE; }
|
||||
|
||||
for ( index = 0 ; index < (rcnt-1) ; index++){
|
||||
TIMER__Wait_us(SW_I2C_WAIT_TIME);
|
||||
pdata[index] = SW_I2C_Read_Data(sel);
|
||||
i2c_send_ack(sel);
|
||||
|
||||
}
|
||||
|
||||
pdata[rcnt-1] = SW_I2C_Read_Data(sel);
|
||||
|
||||
i2c_check_not_ack(sel);
|
||||
|
||||
i2c_stop_condition(sel);
|
||||
|
||||
i2c_start_condition(sel); //TODO
|
||||
i2c_slave_address(sel, IICID, WRITE_CMD);
|
||||
i2c_check_ack(sel);
|
||||
i2c_stop_condition(sel);
|
||||
|
||||
return returnack;
|
||||
}
|
||||
|
||||
uint8_t SW_I2C_Check_SlaveAddr(uint8_t sel, uint8_t IICID)
|
||||
{
|
||||
uint8_t returnack = TRUE;
|
||||
|
||||
i2c_start_condition(sel);
|
||||
|
||||
i2c_slave_address(sel, IICID, WRITE_CMD);
|
||||
if (!i2c_check_ack(sel))
|
||||
{
|
||||
returnack = FALSE;
|
||||
}
|
||||
|
||||
return returnack;
|
||||
}
|
||||
|
||||
uint8_t SW_I2C_UTIL_WRITE(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint8_t data)
|
||||
{
|
||||
return SW_I2C_WriteControl_8Bit(sel, IICID<<1, regaddr, data);
|
||||
}
|
||||
|
||||
uint8_t SW_I2C_UTIL_Read(uint8_t sel, uint8_t IICID, uint8_t regaddr)
|
||||
{
|
||||
return SW_I2C_ReadControl_8Bit(sel, IICID<<1, regaddr);
|
||||
}
|
||||
|
||||
uint8_t SW_I2C_UTIL_Read_Multi(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint8_t rcnt, uint8_t (*pdata))
|
||||
{
|
||||
return SW_I2C_Multi_ReadnControl_8Bit(sel, IICID<<1, regaddr, rcnt, pdata);
|
||||
}
|
54
Core/SWI2C/i2c_sw.h
Normal file
54
Core/SWI2C/i2c_sw.h
Normal file
@ -0,0 +1,54 @@
|
||||
#ifndef __I2C_SW_H
|
||||
#define __I2C_SW_H
|
||||
|
||||
/* includes */
|
||||
#include "main.h"
|
||||
#include "stdio.h"
|
||||
|
||||
/* defines */
|
||||
#define GPIO_SW_I2C1_SCL SWI2C_SCL_GPIO_Port
|
||||
#define GPIO_SW_I2C1_SDA SWI2C_SDA_GPIO_Port
|
||||
#define GPIO_SW_I2C1_SCL_PIN SWI2C_SCL_Pin
|
||||
#define GPIO_SW_I2C1_SDA_PIN SWI2C_SDA_Pin
|
||||
/*
|
||||
#define GPIO_SW_I2Cx_SCL GPIOx
|
||||
#define GPIO_SW_I2Cx_SDA GPIOx
|
||||
#define GPIO_SW_I2Cx_SCL_PIN GPIO_PIN_x
|
||||
#define GPIO_SW_I2Cx_SDA_PIN GPIO_PIN_x
|
||||
*/
|
||||
|
||||
#define SW_I2C1 1
|
||||
//#define SW_I2Cx x
|
||||
|
||||
|
||||
/* functions */
|
||||
void TIMER__Wait_us(__IO uint32_t uS);
|
||||
|
||||
void SW_I2C_initial(void);
|
||||
|
||||
void i2c_port_initial(uint8_t sel);
|
||||
|
||||
uint8_t SW_I2C_ReadVal_SDA(uint8_t sel);
|
||||
|
||||
void SW_I2C_Write_Data(uint8_t sel, uint8_t data);
|
||||
uint8_t SW_I2C_Read_Data(uint8_t sel);
|
||||
|
||||
uint8_t SW_I2C_WriteControl_8Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint8_t data);
|
||||
uint8_t SW_I2C_WriteControl_8Bit_OnlyRegAddr(uint8_t sel, uint8_t IICID, uint8_t regaddr);
|
||||
uint8_t SW_I2C_WriteControl_16Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint16_t data);
|
||||
|
||||
uint8_t SW_I2C_ReadControl_8Bit_OnlyRegAddr(uint8_t sel, uint8_t IICID, uint8_t regaddr);
|
||||
uint8_t SW_I2C_ReadControl_8Bit_OnlyData(uint8_t sel, uint8_t IICID);
|
||||
uint16_t SW_I2C_ReadControl_16Bit_OnlyData(uint8_t sel, uint8_t IICID);
|
||||
uint8_t SW_I2C_ReadControl_8Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr);
|
||||
uint16_t SW_I2C_ReadControl_16Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr);
|
||||
|
||||
uint8_t SW_I2C_ReadnControl_8Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint8_t rcnt, uint8_t (*pdata));
|
||||
uint8_t SW_I2C_Multi_ReadnControl_8Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint8_t rcnt, uint8_t (*pdata));
|
||||
uint8_t SW_I2C_Check_SlaveAddr(uint8_t sel, uint8_t IICID);
|
||||
|
||||
uint8_t SW_I2C_UTIL_WRITE(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint8_t data);
|
||||
uint8_t SW_I2C_UTIL_Read(uint8_t sel, uint8_t IICID, uint8_t regaddr);
|
||||
uint8_t SW_I2C_UTIL_Read_Multi(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint8_t rcnt, uint8_t (*pdata));
|
||||
|
||||
#endif /* __I2C_SW_H */
|
43
Core/SWI2C/readme.md
Normal file
43
Core/SWI2C/readme.md
Normal file
@ -0,0 +1,43 @@
|
||||
# Soft I2C For STM32 using HAL
|
||||
|
||||
That is Edited version of [Original version](https://schkorea.tistory.com/437) for stm32
|
||||
|
||||
**usage:**
|
||||
|
||||
define GPIO in `i2c_sw.h`:
|
||||
|
||||
```c
|
||||
#define GPIO_SW_I2C1_SCL GPIOB
|
||||
#define GPIO_SW_I2C1_SDA GPIOB
|
||||
#define GPIO_SW_I2C1_SCL_PIN GPIO_PIN_13
|
||||
#define GPIO_SW_I2C1_SDA_PIN GPIO_PIN_14
|
||||
```
|
||||
|
||||
That example is for `stm32f103` , for use other micro replace `#include "stm32f1xx_hal_gpio.h"` in `i2c_sw.h`.
|
||||
|
||||
This library has the ability to activate more than 10 software I2C , which have been commented in this library, but by default only one of them has been activated.
|
||||
|
||||
**Example:**
|
||||
|
||||
```c
|
||||
#include "i2c_sw.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
SW_I2C_initial();
|
||||
i2c_port_initial(SW_I2C1);
|
||||
|
||||
while(1)
|
||||
{
|
||||
//Write DATA to Reg at Reg_Addr from I2C_Add Device connected to SW_I2C1
|
||||
SW_I2C_WriteControl_8Bit(SW_I2C1,I2C_Add,Reg_Addr,DATA);
|
||||
//Read DATA at Reg_Add from I2C_Add Device connected to SW_I2C1
|
||||
DATA=SW_I2C_ReadControl_8Bit(SW_I2C1,I2C_Add,Reg_Add);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user