1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
请教下,使用 hal 的库函数进行 I2C器件的 AT24C1024 器件的读写,这个读写地址 需要24位,而 hal 库最大支持 16位,那么是不是需要人为的进行修改 这个读写地址 才行 ??? /** * @brief Master sends target device address followed by internal memory address for write request. * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains * the configuration information for I2C module * @param DevAddress: Target device address * @param MemAddress: Internal memory address 此处的地址范围 是16, ????????????? * @param MemAddSize: Size of internal memory address * @param Timeout: Timeout duration * @retval HAL status */ static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout) { /* Generate Start */ hi2c->Instance->CR1 |= I2C_CR1_START; /* Wait until SB flag is set */ if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK) { return HAL_TIMEOUT; } /* Send slave address */ hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress); /* Wait until ADDR flag is set */ if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK) { if(hi2c->ErrorCode == HAL_I2C_ERROR_AF) { return HAL_ERROR; } else { return HAL_TIMEOUT; } } /* Clear ADDR flag */ __HAL_I2C_CLEAR_ADDRFLAG(hi2c); /* Wait until TXE flag is set */ if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK) { return HAL_TIMEOUT; } /* If Memory address size is 8Bit */ if(MemAddSize == I2C_MEMADD_SIZE_8BIT) { /* Send Memory Address */ hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); } /* If Memory address size is 16Bit */ else { /* Send MSB of Memory Address */ hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress); /* Wait until TXE flag is set */ if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK) { return HAL_TIMEOUT; } /* Send LSB of Memory Address */ hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); } return HAL_OK; } |
|
相关推荐
13个回答
|
|
16位 24位地址怎么说
|
|
|
|
可能你理解错了, 16位地址可以 读取到64K内容
|
|
|
|
本帖最后由 hpdell 于 2015-12-4 15:38 编辑 就是这个 uint16_t MemAddress ,这个最大支持 16位的地址(也就是两个字节),但是 24c1024 需要17位地址(这两个字节的地址不够用),到时就会造成读写错误 24c1024 的地址范围,二进制表示: 1 1111 1111 1111 1111 |
|
|
|
就是这个 uint16_t MemAddress ,这个最大支持 16位的地址(也就是两个字节),但是 24c1024 需要17位地址(这两个字节的地址不够用),到时就会造成读写错误 24c1024 的地址范围,二进制表示: 1 1111 1111 1111 1111 |
|
|
|
|
|
|
|
|
|
|
|
本帖最后由 hpdell 于 2015-12-4 20:16 编辑 24c1024 每页是256字节,一共有512 页 24c1024 的最大地址范围是131072,如果从0开始那么就是 0-131071 二进制如下 : |
|
|
|
我没看1024的手册, 不过看了6楼的回答, 觉得有道理, 楼主有没有用过24C02 和24C04/08/16, 地址都是一个字节, 理论只能读256字节范围, 可以却能读写24C16, 24C16有 256*8=2048的字节数哦
|
|
|
|
哈哈哈,不管是页还是扇区,最终都会转化为地址,到时只是把这个地址转换为也或者扇区吧了,我在官方的底层函数的基础上已经改了,现在效果很好,现在读写完全没有问题了, 24c1024 的地址需要3个字节 24c04-24c512 的地址需要2个字节, 24c01-24c02 的地址需要一个字节 |
|
1 条评论
|
|
路过一下
|
|
|
|
楼主注意看一下设备地址介绍。最后以为是读写地址,倒数第二位是区域地址。1024由2个区域组成,每个区域是0-0xFFFF。
|
|
|
|
|
|
|
|
分清除是是device address还是byte address(数据),你说的24为,很可能只是物理地址byte address
start bit+device address+byte address. |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2105 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1941 浏览 3 评论
4537 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2084 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2599 浏览 1 评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 06:59 , Processed in 1.023755 second(s), Total 108, Slave 88 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号