-
Notifications
You must be signed in to change notification settings - Fork 15
/
sw_i2c_port_stm32.c
145 lines (125 loc) · 3.88 KB
/
sw_i2c_port_stm32.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include "sw_i2c.h"
// #include "stm32f1xx_hal.h"
#include "stm32f4xx_hal.h"
#define SW_I2C1_SCL_PORT GPIOB
#define SW_I2C1_SDA_PORT GPIOB
#define SW_I2C1_SCL_PIN GPIO_PIN_6
#define SW_I2C1_SDA_PIN GPIO_PIN_7
//引脚置位
static void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_SET);
}
//引脚复位
static void GPIO_ResetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_RESET);
}
//读引脚状态
static uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
return (uint8_t)HAL_GPIO_ReadPin(GPIOx, GPIO_Pin);
}
//SDA引脚切换输入模式
static void sda_in_mode(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Pin = SW_I2C1_SDA_PIN;
HAL_GPIO_Init(SW_I2C1_SDA_PORT, &GPIO_InitStruct);
}
//SDA引脚切换输出模式
static void sda_out_mode(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Pin = SW_I2C1_SDA_PIN;
HAL_GPIO_Init(SW_I2C1_SDA_PORT, &GPIO_InitStruct);
}
//SCL引脚切换输入模式
static void scl_in_mode(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Pin = SW_I2C1_SCL_PIN;
HAL_GPIO_Init(SW_I2C1_SCL_PORT, &GPIO_InitStruct);
}
//SCL引脚切换输出模式
static void scl_out_mode(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Pin = SW_I2C1_SCL_PIN;
HAL_GPIO_Init(SW_I2C1_SCL_PORT, &GPIO_InitStruct);
}
static int sw_i2c_port_initial(void)
{
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
// i2c_sw SCL
GPIO_InitStruct.Pin = SW_I2C1_SCL_PIN;
HAL_GPIO_Init(SW_I2C1_SCL_PORT, &GPIO_InitStruct);
// i2c_sw SDA
GPIO_InitStruct.Pin = SW_I2C1_SDA_PIN;
HAL_GPIO_Init(SW_I2C1_SDA_PORT, &GPIO_InitStruct);
return 0;
}
static void sw_i2c_port_delay_us(uint32_t us)
{
uint32_t nCount = us/10*25;
for (; nCount != 0; nCount--);
}
static int sw_i2c_port_io_ctl(uint8_t opt, void *param)
{
int ret = -1;
switch (opt)
{
case HAL_IO_OPT_SET_SDA_HIGH:
GPIO_SetBits(SW_I2C1_SDA_PORT, SW_I2C1_SDA_PIN);
break;
case HAL_IO_OPT_SET_SDA_LOW:
GPIO_ResetBits(SW_I2C1_SDA_PORT, SW_I2C1_SDA_PIN);
break;
case HAL_IO_OPT_GET_SDA_LEVEL:
ret = GPIO_ReadInputDataBit(SW_I2C1_SDA_PORT, SW_I2C1_SDA_PIN);
break;
case HAL_IO_OPT_SET_SDA_INPUT:
sda_in_mode();
break;
case HAL_IO_OPT_SET_SDA_OUTPUT:
sda_out_mode();
break;
case HAL_IO_OPT_SET_SCL_HIGH:
GPIO_SetBits(SW_I2C1_SCL_PORT, SW_I2C1_SCL_PIN);
break;
case HAL_IO_OPT_SET_SCL_LOW:
GPIO_ResetBits(SW_I2C1_SCL_PORT, SW_I2C1_SCL_PIN);
break;
case HAL_IO_OPT_GET_SCL_LEVEL:
ret = GPIO_ReadInputDataBit(SW_I2C1_SCL_PORT, SW_I2C1_SCL_PIN);
break;
case HAL_IO_OPT_SET_SCL_INPUT:
scl_in_mode();
break;
case HAL_IO_OPT_SET_SCL_OUTPUT:
scl_out_mode();
break;
default:
break;
}
return ret;
}
sw_i2c_t sw_i2c_stm32_f4 = {
.hal_init = sw_i2c_port_initial,
.hal_io_ctl = sw_i2c_port_io_ctl,
.hal_delay_us = sw_i2c_port_delay_us,
};