你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
HAL_I2C库函数时序问题
[复制链接]
jyl_518
提问时间:2020-3-4 10:33 /
HAL_I2C库函数,常规格时序的读写很好用。
但如下二图的时序读写数据(二张图之间还要+20ms延时),使用HAL_I2C库函数怎么进行读写,
能否有自定议的时间操作方法?
如自己写个函数:start ,stop,ACK,器件地址(读/写)自己确定位置?
库函数内找半天,没找到有单独的start,stop,ACK,单独传输数据、接收数据等的函数。
像这种情况还适合用HAL_I2C库函数吗???
+
20ms延时
+
赞
0
收藏
0
评论
2
分享
发布时间:2020-3-4 10:33
举报
请先
登录
后回复
2个回答
李康1202
回答时间:2020-3-4 11:49:11
a0a.1 32b0c
同求!HAL库IIC据说有问题,没用过,求大佬指教!!!
赞
0
评论
回复
支持
反对
网络孤客
回答时间:2020-3-4 15:13:16
a0a.1 32b0c
先传输第一张图,PRB代表Pointer Register Byte,1Byte:
HAL_I2C_Master_Transmit(&hi2c1,DevAddress,PRB,1,I2C_Timeout);
HAL_Delay(20);
再传输第二张图,Data,2Byte:
HAL_I2C_Master_Transmit(&hi2c1,DevAddress,Data,2,I2C_Timeout);
再看函数
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
其中矛盾点在于地址是:uint16_t DevAddress
楼主要求是只传8bits,但程序究竟是传输8bits还是16bits?
调看库程序
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
......
/* Send Slave Address */
if(I2C_MasterRequestWrite(hi2c, DevAddress, Timeout, tickstart) != HAL_OK)
{
......
}
还是没解决,继续跟踪
static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart)
{
......
if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
{
/* Send slave address */
hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
}
else
{
/* Send header of slave address */
hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress);
......
return HAL_OK;
}
在stm32f1xx_hal_i2c.h中找到
#define I2C_7BIT_ADD_WRITE(__ADDRESS__) ((uint8_t)((__ADDRESS__) & (~I2C_OAR1_ADD0)))
哈哈,还是变回8bits
评分
参与人数
1
蝴蝶豆
+5
收起
理由
STMCU
+ 5
查看全部评分
赞
0
评论
回复
支持
反对
所属标签
相似问题
关于
意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
HAL_I2C_Master_Transmit(&hi2c1,DevAddress,PRB,1,I2C_Timeout);
HAL_Delay(20);
再传输第二张图,Data,2Byte:
HAL_I2C_Master_Transmit(&hi2c1,DevAddress,Data,2,I2C_Timeout);
再看函数
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
其中矛盾点在于地址是:uint16_t DevAddress
楼主要求是只传8bits,但程序究竟是传输8bits还是16bits?
调看库程序
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
......
/* Send Slave Address */
if(I2C_MasterRequestWrite(hi2c, DevAddress, Timeout, tickstart) != HAL_OK)
{
......
}
还是没解决,继续跟踪
static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart)
{
......
if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
{
/* Send slave address */
hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
}
else
{
/* Send header of slave address */
hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress);
......
return HAL_OK;
}
在stm32f1xx_hal_i2c.h中找到
#define I2C_7BIT_ADD_WRITE(__ADDRESS__) ((uint8_t)((__ADDRESS__) & (~I2C_OAR1_ADD0)))
哈哈,还是变回8bits
评分
查看全部评分