11 #include "sysconfig.h" 20 #include "stm32f4xx_hal.h" 26 typedef struct st_i2c_data {
29 I2C_HandleTypeDef hi2c;
31 unsigned short seek_addr;
34 static st_i2c_data i2c_prv_data[1];
37 void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
40 GPIO_InitTypeDef GPIO_InitStruct;
41 if(hi2c->Instance==I2C1) {
42 GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
43 GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
44 GPIO_InitStruct.Pull = GPIO_PULLUP;
45 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
46 GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
47 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
48 __HAL_RCC_I2C1_CLK_ENABLE();
58 static void init_i2c(
struct st_device *dev)
61 I2C_HandleTypeDef *hi2c = &(i2c_data->hi2c);
63 __HAL_RCC_GPIOB_CLK_ENABLE();
64 __HAL_RCC_GPIOD_CLK_ENABLE();
66 if(dev == &i2c_device) {
67 hi2c->Instance = I2C1;
70 hi2c->Init.ClockSpeed = 100000;
71 hi2c->Init.DutyCycle = I2C_DUTYCYCLE_2;
72 hi2c->Init.OwnAddress1 = 0;
73 hi2c->Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
74 hi2c->Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
75 hi2c->Init.OwnAddress2 = 0;
76 hi2c->Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
77 hi2c->Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
78 if(HAL_I2C_Init(hi2c) != HAL_OK) {
79 SYSERR_PRINT(
"I2C Initialize error(%s)\n", dev->
name);
83 static int i2c_register(
struct st_device *dev,
char *param)
87 i2c_data->config.speed = 100;
89 i2c_data->config.slave_addr = 0x00;
90 i2c_data->config.mem_addr_size = I2C_MEMADD_SIZE_8BIT;
91 i2c_data->seek_addr = 0;
98 static int i2c_open(
struct st_device *dev)
103 static int i2c_close(
struct st_device *dev)
108 static int i2c_read(
struct st_device *dev,
void *data,
unsigned int size)
111 I2C_HandleTypeDef *hi2c = &(i2c_data->hi2c);
112 unsigned short slave_addr = i2c_data->config.slave_addr;
113 unsigned short i2c_memadd_size = I2C_MEMADD_SIZE_8BIT;
114 HAL_StatusTypeDef rtn = 0;
116 DKFPRINTF(0x01,
"size = %d\n", size);
118 switch(i2c_data->config.mem_addr_size) {
120 i2c_memadd_size = I2C_MEMADD_SIZE_8BIT;
123 i2c_memadd_size = I2C_MEMADD_SIZE_16BIT;
129 DKPRINTF(0x01,
"I2C READ ADDRESS %08X\n", (
unsigned int)i2c_data->seek_addr);
131 rtn = HAL_I2C_Mem_Read(hi2c,
139 i2c_data->seek_addr += size;
146 static int i2c_write(
struct st_device *dev,
const void *data,
unsigned int size)
149 I2C_HandleTypeDef *hi2c = &(i2c_data->hi2c);
150 unsigned short slave_addr = i2c_data->config.slave_addr;
151 unsigned short i2c_memadd_size = I2C_MEMADD_SIZE_8BIT;
152 HAL_StatusTypeDef rtn = 0;
154 DKFPRINTF(0x01,
"size = %d\n", size);
156 switch(i2c_data->config.mem_addr_size) {
158 i2c_memadd_size = I2C_MEMADD_SIZE_8BIT;
161 i2c_memadd_size = I2C_MEMADD_SIZE_16BIT;
167 DKPRINTF(0x01,
"I2C WRITE ADDRESS %08X\n", (
unsigned int)i2c_data->seek_addr);
169 rtn = HAL_I2C_Mem_Write(hi2c,
173 (
unsigned char *)data, size,
177 i2c_data->seek_addr += size;
184 static int i2c_set_speed(I2C_TypeDef *i2cx,
int speed)
189 static int i2c_ioctl(
struct st_device *dev,
unsigned int com,
unsigned int arg,
void *param)
192 I2C_TypeDef *i2cx = i2c_data->hi2c.Instance;
197 i2c_data->config.speed = arg;
198 rtn = i2c_set_speed(i2cx, arg);
203 i2c_data->config.slave_addr = arg;
209 DKPRINTF(0x01,
"I2C IOCTL Memory Address Size %dbit\n",
211 i2c_data->config.mem_addr_size = arg;
219 i2c_data->config.speed = conf->
speed;
221 i2c_data->config.slave_addr = conf->
slave_addr;
227 SYSERR_PRINT(
"Unknown ioctl(%08lX)\n", com);
235 static int i2c_seek(
struct st_device *dev,
int offset,
int whence)
241 DKPRINTF(0x01,
"I2C SEEK_SET Address %08X\n", offset);
242 i2c_data->seek_addr = offset;
246 DKPRINTF(0x01,
"I2C SEEK_CUR Address %08X\n", offset);
247 i2c_data->seek_addr += offset;
252 SYSERR_PRINT(
"Unknown seek whence(%08lX)\n", whence);
256 return i2c_data->seek_addr;
259 static int i2c_suspend(
struct st_device *dev)
264 static int i2c_resume(
struct st_device *dev)
273 .explan =
"STM32F4 I2C1 Master",
274 .private_data = (
void *)&i2c_prv_data[0],
275 .register_dev = i2c_register,
276 .
mutex = &i2c_mutex[0],
#define IOCMD_I2C_MEMADDRSIZE
Memory Address Size 8bit or 16bit etc
struct st_mutex * mutex
デバイス排他アクセス用MUTEX
void * private_data
ドライバ固有データポインタ
#define IOCMD_I2C_SPEED
com : 通信速度を設定する, arg : 通信速度(bps)
#define I2C_ADDR_MODE_7BIT
I2C 7ビットアドレスモード
#define IOCMD_I2C_SETCONFIG
Device Access configration
#define I2C_MEM_ADDR_SIZE_16BIT
I2Cスレーブデバイスメモリアドレスサイズは16ビット
int suspend(void)
全デバイスを休止状態にする
#define I2C_MEM_ADDR_SIZE_8BIT
I2Cスレーブデバイスメモリアドレスサイズは8ビット
#define IOCMD_I2C_SLAVE_ADDR7
Set Save 7bit Address
#define DEF_DEV_NAME_I2C
標準I2Cコントローラデバイス名
int mem_addr_size
I2Cスレーブデバイスメモリアドレスサイズ
int resume(void)
全デバイスを活性化する
#define SEEK_END
ファイルサイズに加算
char name[MAX_DEVNAMELRN]
デバイス名文字列
unsigned int slave_addr
I2Cスレーブデバイスアドレス