新手上路
- 积分
- 29
- 金钱
- 29
- 注册时间
- 2018-2-28
- 在线时间
- 3 小时
|
15金钱
最终目的:利用STM32硬件IIC实现对某一从设备的读访问
(PS:最好是玩过F7系列板子的人,因为F7的IIC的库函数和之前F4的不一样,当然如果是大神,还请不吝赐教 )
具体要求:
1、使用F7系列(比如我的板子是F767ZI)自带的硬件IIC,而非模拟IIC
2、最好使用F7自带的官方库函数
3、根据读从设备IIC的时序要求(具体就是:F767发START信号,发从设备地址+写信号,收到ACK,再发从设备里具体寄存器的地址,收到ACK,然后重发START信号给从设备,再发 从设备地址+读信号,收到ACK,然后开始读从设备里具体寄存器传过来的数据,发出ACK和STOP信号)(从设备的写地址是0X34,读地址是0X35;具体寄存器的地址是0X02,读的数 据分为只读1字节和读65字节两种)
目前遇到的问题:
由于F7库的硬件IIC库的函数和F4系列的硬件IIC的库函数不一样,F7库函数硬件IIC里面没有generate_start,generate_stop等分立的某一个小阶段的函数,它直接是给出的封装好的一整个的读写函数,然后通过IIC里的寄存器的某些位发生变化,由硬件控制发出START STOP等信号;比如(F7HAL库IIC的一些函数:HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)、HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)等等),我没有办法在发完寄存器地址后,跳过STOP信号,直接发RESTART信号开始读访问;我的源程序如下:
//IIC从HTPA读一个字节
//reg:寄存器地址
//返回值:读到的数据
unsigned char HTPA_ReadOneByte(unsigned char reg)
{
unsigned char res;
unsigned char temp1=HAL_I2C_Master_Transmit(&hi2c2, HTPA_ADDR|0X00, ®,1, 1000);//器件地址+写地址 寄存器地址
unsigned char temp2=HAL_I2C_Master_Receive(&hi2c2, HTPA_ADDR|0X01, &res,1, 1000);//器件地址+读地址 接收到的数据
return res;
}
//这样出现的问题就是,我写完成后,硬件会自动发STOP信号,然后再进行读操作。
通过抓取波形,发现写成功了(从设备会回给你ACK),但是读的时候,当我把器件地址+读地址发过去时,STM32F7会收到一个NACK,无法读取寄存器里的数据
附件里是读的时序图要求
(金币虽然不是很多,但已经是我一个萌新的所有金币,希望所有路过的大神,能多看一眼,帮我解决一下这个问题 )
|
-
|