|
int8_t I2C_write(uint8_t addr, uint8_t reg_addr, const uint8_t* data, uint8_t len) // packet function { HAL_StatusTypeDef status =HAL_OK; uint16_t deviceWriteAddr = (addr << 1); //7 bit write address shall be pre-processed status = HAL_I2C_Mem_Write(&hi2c1,deviceWriteAddr,(uint16_t)reg_addr,1,(uint8_t*)data,(uint16_t)len,I2C_READ_TIMEOUT); if (HAL_OK != status) { printf("I2C Write Fail:%d\n\r",status); return status; } return HAL_OK; } int8_t I2C_read(uint8_t addr, uint8_t reg_addr, const uint8_t* data, uint8_t len) //re packet function { HAL_StatusTypeDef status =HAL_OK; uint16_t deviceWriteAddr = addr << 1; //7 bit write address shall be pre-processed uint16_t deviceReadAddr = (addr << 1)|0x01; //7 bit read address shall be pre-processed uint8_t regAddr = reg_addr; status = HAL_I2C_Master_Transmit(&hi2c1,deviceWriteAddr,®Addr,1,I2C_READ_TIMEOUT); if (HAL_OK != status) { printf("I2C readreg Fail:%d\n\r",status); return status; } status = HAL_I2C_Master_Receive(&hi2c1,deviceReadAddr,(uint8_t*)data,(uint16_t)len,I2C_READ_TIMEOUT); // if (HAL_OK != status) { printf("I2C Read1 Fail:%d\n\r",status); return status; } return HAL_OK; } 写是用HAL_I2C_Mem_Write() 重新打包; 读操作原本要用HAL_I2C_Mem_Read,发现多字节request时,返回 I2C error. 如上改过后,单字节,多字节 读写稳定。 HAL_I2C_Mem_Write/HAL_I2C_Mem_Read 都是cubeMX 工具生成的HAL库。 我是在STM32L4系列使用的。 我参考的I2C 协议参考:http://www.cnblogs.com/aaronLinux/p/6218660.html |
STM32
超强工具——STM32CubeMX 你会用吗?
集结出发! STM32全国研讨会系列之一:ST智能门铃中国首秀
关于STM32启动文件的几个小问题
【银杏科技ARM+FPGA双核心应用】STM32H7系列35——USB_VCP_FS
【银杏科技ARM+FPGA双核心应用】STM32H7系列28——USB_HID
粉丝分享 | 图说CRC原理应用及STM32硬件CRC外设
STM32L151进入低功耗,并由RTC唤醒的故事
[转]stm32控制NFC模块(PN532)源码(P2P,模拟卡,读写卡等
STM32G070RB+LVGL移植
微信公众号
手机版