如何解决从I2C从器件确定NACK的原因
我对I2C还是陌生的,所以请原谅我缺乏知识。我正在尝试使用带有HAL库和cubemx代码生成器的Stm32H743ZI MCU从PAC1710 sensor读取数据。
我可以发送邮件的第一部分,但是发送地址后没有得到确认。我在ADDR_SEL引脚上使用2700欧姆电阻接地,ALERT在10 kOhm电阻上接地。
对于我的代码,这是我的实例化:
void MX_I2C2_Init(void)
{
hi2c2.Instance = I2C2;
hi2c2.Init.Timing = 0x307075B1;
hi2c2.Init.OwnAddress1 = 0;
hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c2.Init.OwnAddress2 = 0;
hi2c2.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c2) != HAL_OK) {
Error_Handler();
}
/** Configure Analogue filter */
if (HAL_I2CEx_ConfigAnalogFilter(&hi2c2,I2C_ANALOGFILTER_ENABLE) != HAL_OK) {
Error_Handler();
}
/** Configure Digital filter */
if (HAL_I2CEx_ConfigDigitalFilter(&hi2c2,0) != HAL_OK) {
Error_Handler();
}
}
void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if (i2cHandle->Instance == I2C2) {
/* USER CODE BEGIN I2C2_MspInit 0 */
/* USER CODE END I2C2_MspInit 0 */
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/**I2C2 GPIO Configuration
PB11 ------> I2C2_SDA
PF1 ------> I2C2_SCL
*/
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_I2C2;
HAL_GPIO_Init(GPIOF,&GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_I2C2;
HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);
/* I2C2 clock enable */
__HAL_RCC_I2C2_CLK_ENABLE();
}
}
我的实现非常简单:
uint8_t i2cbuffer[8];
uint16_t val = 0;
HAL_StatusTypeDef ret;
在主循环中,我有以下代码:
i2cbuffer[0] = 254;
ret = HAL_I2C_Master_Transmit(&hi2c2,PAC1710Address << 1,i2cbuffer,1,HAL_MAX_DELAY);
if (ret == HAL_OK) {
ret = HAL_I2C_Master_Receive(&hi2c2,2,HAL_MAX_DELAY);
if (ret == HAL_OK) {
val = i2cbuffer[0];
}
}
HAL_Delay(500);
我之所以选择254,是因为尽管奴隶不管他的身高如何,都应该能够回答。但是,我什至没有发送过寄存器,在用示波器调查之后,我发送了地址并得到了NACK。
有什么明显的我想念的吗?
解决方法
经过一番评论,还有更多有用的信息,其中最大的一部分是示波器显示了parameters:
- name: packageVersion
displayName: Package version
type: string
default: '1.0.1'
trigger: none
jobs:
- job: Deploy
displayName: Deploy
steps:
- task: DownloadPackage@1
displayName: "Artifacts - download"
inputs:
packageType: 'npm'
feed: '38a52be4-9352-453e-af97-5c3b448652f0/38a52be4-9352-453e-af97-5c3b448652f0'
view: '070e33c7-f5c8-4561-8186-5c3b448652f0'
definition: '1f32cfbf-1427-4b27-8476-5c3b448652f0'
version: '${{ parameters.packageVersion }}'
downloadPath: '$(System.ArtifactsDirectory)'
。虽然Start 1010100 0 1 Stop
是0x54地址,但是1010100
位也需要计数,因此8位数据实际上是W
,而不是预期的10101000
。地址应该 not 左移,因为它已经正确了。
这是I2C的一个常见错误。需要注意确切的地址和01010100
位,例如在某些文档和API中它们向左移动,而在某些文档和API中则不是。
这里有一个非常有用的信息是示波器跟踪,它确实有助于显示到底发生了什么。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。