Продолжаем разговор

. Компас после нескольких месяцев не заработал

Причина - не получаю ACK после передачи адреса.
Привожу немного измененный код
Код
#include "stm32f10x.h"
#include "stm32f10x_i2c.h"
I2C_InitTypeDef I2C_InitStructure;
FlagStatus Status = SET;
#define ReadAddress 0x43
#define WriteAddress 0x42
#define BufferSize 4
#define GetHeading 0x41
#define ClockSpeed 100000
int I2C_address = 0;
bool exit = FALSE;
I2C_TypeDef* HMC6352_I2C;
void HMC6352Init(I2C_TypeDef* HMC6352_I2Cx)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
HMC6352_I2C = HMC6352_I2Cx;
I2C_Cmd(HMC6352_I2C, DISABLE);
I2C_DeInit(HMC6352_I2C);
/* Configure I2C1 pins: SCL and SDA ----------------------------------------*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* I2C1 configuration ------------------------------------------------------*/
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = ClockSpeed;
I2C_Init(HMC6352_I2C, &I2C_InitStructure);
I2C_Cmd(HMC6352_I2C, ENABLE);
}
int HMC6352GetHeading()
{
__IO uint16_t RegValue = 0;
I2C_AcknowledgeConfig(HMC6352_I2C, ENABLE);
/*--------------------------------- Transmission Phase ------------------*/
I2C_GenerateSTART(HMC6352_I2C, ENABLE);
while (!I2C_CheckEvent(HMC6352_I2C, I2C_EVENT_MASTER_MODE_SELECT)); /*!< EV5 */
I2C_Send7bitAddress(HMC6352_I2C, WriteAddress, I2C_Direction_Transmitter);
while (!I2C_CheckEvent(HMC6352_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); /*!< EV6 */
I2C_SendData(HMC6352_I2C, GetHeading);
while (!I2C_CheckEvent(HMC6352_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); /*!< EV8 */
/*-------------------------------- Reception Phase --------------------------*/
I2C_GenerateSTART(HMC6352_I2C, ENABLE);
while (!I2C_CheckEvent(HMC6352_I2C, I2C_EVENT_MASTER_MODE_SELECT)); /*!< EV5 */
I2C_Send7bitAddress(HMC6352_I2C, ReadAddress, I2C_Direction_Receiver);
while (!I2C_CheckEvent(HMC6352_I2C, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); /*!< EV6 */
while (!I2C_CheckEvent(HMC6352_I2C, I2C_EVENT_MASTER_BYTE_RECEIVED)); /*!< EV7 */
RegValue = I2C_ReceiveData(HMC6352_I2C) << 8;
I2C_AcknowledgeConfig(HMC6352_I2C, DISABLE);
I2C_GenerateSTOP(HMC6352_I2C, ENABLE);
while (I2C_GetFlagStatus(HMC6352_I2C, I2C_FLAG_RXNE) == RESET);
RegValue |= I2C_ReceiveData(HMC6352_I2C);
return (RegValue/10);
}
И сигналы SCL и SDA. По сигналам видно что нормально происходит старт I2c, посылка адреса, но на 9 клоке SDA = 1, компас не ответил :cry:
Частота настроена верно. Питание на компасе есть. Подтягивающие резисторы на SCL и SDA по 2КОм, при 10КОм, как в ДШ на компас, сильно заваливались фронты.
Подскажите, в чем может быть причина отсутствия ACK?
Эскизы прикрепленных изображений