123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- #include "lt_fdc2214_iic.h"
- #include "stm32l4xx_hal.h"
- #include "main.h"
- SoftI2C_HandleTypeDef hi2c1 = {
- .SDA_Port = GPIOB,
- .SDA_Pin = IIC_SDA_Pin,
- .SCL_Port = GPIOB,
- .SCL_Pin = IIC_SCL_Pin
- };
- SoftI2C_HandleTypeDef hi2c2 = {
-
- .SDA_Port = GPIOB,
- .SDA_Pin = IIC_SDA2_Pin,
- .SCL_Port = GPIOB,
- .SCL_Pin = IIC_SCL2_Pin
- };
- extern TIM_HandleTypeDef htim15;
- void SoftI2C_Init(SoftI2C_HandleTypeDef* hi2c)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- GPIO_InitStruct.Pin = hi2c->SCL_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
- GPIO_InitStruct.Pull = GPIO_PULLUP;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
- HAL_GPIO_Init(hi2c->SCL_Port, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = hi2c->SDA_Pin;
- HAL_GPIO_Init(hi2c->SDA_Port, &GPIO_InitStruct);
- HAL_GPIO_WritePin(hi2c->SCL_Port, hi2c->SCL_Pin, GPIO_PIN_SET);
- HAL_GPIO_WritePin(hi2c->SDA_Port, hi2c->SDA_Pin, GPIO_PIN_SET);
- }
- static void FDC2214_SDA_IN(SoftI2C_HandleTypeDef* hi2c)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- GPIO_InitStruct.Pin = hi2c->SDA_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- HAL_GPIO_Init(hi2c->SDA_Port, &GPIO_InitStruct);
-
- }
- static void FDC2214_SDA_OUT(SoftI2C_HandleTypeDef* hi2c)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- GPIO_InitStruct.Pin = hi2c->SDA_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
- GPIO_InitStruct.Pull = GPIO_PULLUP;
- HAL_GPIO_Init(hi2c->SDA_Port, &GPIO_InitStruct);
- }
- static void SDA_Write(SoftI2C_HandleTypeDef* hi2c, GPIO_PinState state) {
- HAL_GPIO_WritePin(hi2c->SDA_Port, hi2c->SDA_Pin, state);
- }
- static void SCL_Write(SoftI2C_HandleTypeDef* hi2c, GPIO_PinState state) {
- HAL_GPIO_WritePin(hi2c->SCL_Port, hi2c->SCL_Pin, state);
- }
- static GPIO_PinState SDA_Read(SoftI2C_HandleTypeDef* hi2c) {
- return HAL_GPIO_ReadPin(hi2c->SDA_Port, hi2c->SDA_Pin);
- }
- void delay_us(uint32_t us)
- {
- uint16_t start = __HAL_TIM_GET_COUNTER(&htim15);
- while((__HAL_TIM_GET_COUNTER(&htim15) - start) < us);
- }
- void FDC2214_IIC_Start(SoftI2C_HandleTypeDef* hi2c) {
- FDC2214_SDA_OUT(hi2c);
- SDA_Write(hi2c, GPIO_PIN_SET);
- SCL_Write(hi2c, GPIO_PIN_SET);
- delay_us(2);
- SDA_Write(hi2c, GPIO_PIN_RESET);
- delay_us(2);
- SCL_Write(hi2c, GPIO_PIN_RESET);
- delay_us(2);
- }
- void FDC2214_IIC_Stop(SoftI2C_HandleTypeDef* hi2c) {
- FDC2214_SDA_OUT(hi2c);
- SCL_Write(hi2c, GPIO_PIN_RESET);
- delay_us(2);
- SDA_Write(hi2c, GPIO_PIN_RESET);
- delay_us(2);
- SCL_Write(hi2c, GPIO_PIN_SET);
- delay_us(2);
- SDA_Write(hi2c, GPIO_PIN_SET);
- delay_us(2);
- }
- uint8_t FDC2214_IIC_Wait_Ack(SoftI2C_HandleTypeDef* hi2c) {
- uint8_t waitTime = 0;
- FDC2214_SDA_IN(hi2c);
- SDA_Write(hi2c, GPIO_PIN_SET);
- delay_us(2);
- SCL_Write(hi2c, GPIO_PIN_SET);
- delay_us(2);
- while (SDA_Read(hi2c)) {
- waitTime++;
- if (waitTime > 250) {
- FDC2214_IIC_Stop(hi2c);
- return 1;
- }
- }
- SCL_Write(hi2c, GPIO_PIN_RESET);
- return 0;
- }
- void FDC2214_IIC_Ack(SoftI2C_HandleTypeDef* hi2c) {
- SCL_Write(hi2c, GPIO_PIN_RESET);
- delay_us(2);
- FDC2214_SDA_OUT(hi2c);
- SDA_Write(hi2c, GPIO_PIN_RESET);
- delay_us(2);
- SCL_Write(hi2c, GPIO_PIN_SET);
- delay_us(2);
- SCL_Write(hi2c, GPIO_PIN_RESET);
- delay_us(2);
- }
- void FDC2214_IIC_NAck(SoftI2C_HandleTypeDef* hi2c) {
- SCL_Write(hi2c, GPIO_PIN_RESET);
- delay_us(2);
- FDC2214_SDA_OUT(hi2c);
- SDA_Write(hi2c, GPIO_PIN_SET);
- delay_us(2);
- SCL_Write(hi2c, GPIO_PIN_SET);
- delay_us(2);
- SCL_Write(hi2c, GPIO_PIN_RESET);
- delay_us(2);
- }
- void FDC2214_IIC_Send_Byte(SoftI2C_HandleTypeDef* hi2c, uint8_t dat) {
-
- FDC2214_SDA_OUT(hi2c);
- SCL_Write(hi2c, GPIO_PIN_RESET);
- for (uint8_t t = 0; t < 8; t++) {
- delay_us(2);
- if (dat & 0x80)
- SDA_Write(hi2c, GPIO_PIN_SET);
- else
- SDA_Write(hi2c, GPIO_PIN_RESET);
- dat <<= 1;
- delay_us(2);
- SCL_Write(hi2c, GPIO_PIN_SET);
- delay_us(2);
- SCL_Write(hi2c, GPIO_PIN_RESET);
- delay_us(2);
- }
- }
- uint8_t FDC2214_IIC_Read_Byte(SoftI2C_HandleTypeDef* hi2c, uint8_t ack) {
- uint8_t receive = 0;
- SDA_Write(hi2c, GPIO_PIN_SET);
- FDC2214_SDA_IN(hi2c);
- for (uint8_t i = 0; i < 8; i++) {
- receive <<= 1;
- SCL_Write(hi2c, GPIO_PIN_RESET);
- delay_us(2);
- SCL_Write(hi2c, GPIO_PIN_SET);
- delay_us(2);
- if (SDA_Read(hi2c)) receive++;
- }
- SCL_Write(hi2c, GPIO_PIN_RESET);
- if (ack)
- FDC2214_IIC_NAck(hi2c);
- else
- FDC2214_IIC_Ack(hi2c);
- return receive;
- }
|