Easyelectronics.ru

Электроника для всех
Текущее время: 18 май 2022, 15:56

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: STM8 + MPU-6050 = Не читаются регистры
СообщениеДобавлено: 04 ноя 2014, 19:53 
Только пришел

Зарегистрирован: 08 июл 2012, 14:08
Сообщения: 19
Доброго всем дня.

Пробую запустить вышеуказанную связку. При записи в регистры везде Ack, а читать не получается - шина "подвисает".
Вроде всё делаю по даташиту, а результат - 0. Вот процедура опроса регистра (работала с другими I2C устройствами):

uint8_t MPU6050ReadReg(uint8_t regaddr)
{
uint8_t tmp;

I2C_GenerateSTART(ENABLE);
while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(MPU6050_Write, I2C_DIRECTION_TX); // Передаем на 0xD0 (0x68 << 1)
while (!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

I2C_SendData(regaddr); // WhoAmI register 0x75
while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_GenerateSTART(ENABLE);
while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(MPU6050_Read, I2C_DIRECTION_RX); // Передаем на 0xD1
while (!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED));
tmp = I2C_ReceiveData();

I2C_GenerateSTOP(ENABLE); // Send STOP Condition

return tmp;
}

Разница между первой и второй картинками наличие Стоп-а перед вторым Старт-ом (попробовал от безысходности). В этом случае регистр прочитался, но шина опять "зависла".
Шину инициализирую так:

void I2C_Config(void)
{
I2C_DeInit();
I2C_Init(400000, OwnAddress, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 16);
I2C_Cmd(ENABLE);
}

А тактирование шины вот так:
CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, ENABLE);

Может кто сталкивался с таким?
Пишу в ИАР с СТМ-овскими либами.


Вложения:
Комментарий к файлу: Результат опроса регистров с добавлением Стоп-а перед вторым Старт-ом: Старт + адрес устройства на записть + номер регистра + Стоп + Старт + адрес устройства на чтение + чтение регистра + Стоп.
NoEnableStop.jpg
NoEnableStop.jpg [ 169.35 Кб | Просмотров: 5063 ]
Комментарий к файлу: Результат опроса регистров по мануалу: Старт + адрес устройства на записть + номер регистра + Старт + адрес устройства на чтение + чтение регистра + Стоп.
NoEnableStart.jpg
NoEnableStart.jpg [ 172.26 Кб | Просмотров: 5063 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8 + MPU-6050 = Не читаются регистры
СообщениеДобавлено: 05 ноя 2014, 13:58 
Только пришел

Зарегистрирован: 08 июл 2012, 14:08
Сообщения: 19
Вот код инициализации:

void MPU6050Config(void)
{
MPU6050WriteReg(MPU6050_PWR_MGMT1, 0x80); // Reset whole unit to defaults
Delay(100); // 100ms delay after reset
MPU6050WriteReg(MPU6050_SIGNALP_RST, 0x07); // Reset sensors to defaults
Delay(100); // 100ms delay after reset
MPU6050WriteReg(MPU6050_PWR_MGMT1, 0x03); // Setting clocking source from Gyro Z axis
MPU6050WriteReg(MPU6050_SMPLRT, 0x04); // Setting sample rate to 1000/1+4 = 200Hz
MPU6050WriteReg(MPU6050_CONFIG, 0x03); // DLPF is set to 42 Gyro Hz. ExtSync is off
MPU6050WriteReg(MPU6050_GYRO_CONFIG, 0xE8);
MPU6050WriteReg(MPU6050_ACCEL_CONFIG, 0xE0);
MPU6050WriteReg(MPU6050_FIFO_EN, 0x00);
Delay(100);
}

void MPU6050WriteReg(uint8_t Reg, uint8_t Value)
{
I2C_GenerateSTART(ENABLE);
while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(MPU6050_Write, I2C_DIRECTION_TX); // Selecting write mode
while (!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

I2C_SendData(Reg); // Sending register name
while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_SendData(Value); // Sending register value
while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_GenerateSTOP(ENABLE); // Send STOP Condition
Delay(6);
}

Есть у кого идеи?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8 + MPU-6050 = Не читаются регистры
СообщениеДобавлено: 10 ноя 2014, 19:39 
Только пришел

Зарегистрирован: 08 июл 2012, 14:08
Сообщения: 19
Спасибо всем ответившим.

Прямо перед чтением регистра вместо повторного "Старт" надо "Стоп"+"Старт", а после чтения регистра отправить NACK.
До первого докопался методом тыка, т.к. везде указан ре-Старт, а второе смотреть RM0016 стр. 288 и 289.
Короче, чтобы никто на эти грабли больше не наступал, процедура выбора и опроса регистра будет выглядеть так:

uint8_t MPU6050ReadReg(uint8_t regaddr)
{
uint8_t tmp;

I2C_GenerateSTART(ENABLE);
while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(MPU6050_Write, I2C_DIRECTION_TX); // Device address and direction
while (!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

I2C_SendData(regaddr); // Mode register
while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_GenerateSTOP(ENABLE); // Generating Stop - Ре-Старт не прокатывает без Стоп-а
I2C_GenerateSTART(ENABLE);
while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(MPU6050_Write, I2C_DIRECTION_RX); // Device address and direction
while (!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED));
tmp = I2C_ReceiveData(); // Reading data from the buffer

I2C->CR2 &= ~I2C_CR2_ACK; // Sending NACK, so slave will release SDA - Без NACK-а слейв не освобождает линию
I2C_GenerateSTOP(ENABLE); // Send STOP Condition

return tmp;
}


Вложения:
Комментарий к файлу: Результат работы вышеуказанной функции.
IIC.png
IIC.png [ 69.88 Кб | Просмотров: 4936 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8 + MPU-6050 = Не читаются регистры
СообщениеДобавлено: 19 июн 2020, 20:46 
Только пришел
Аватара пользователя

Зарегистрирован: 20 сен 2017, 21:58
Сообщения: 13
Тема старая, но может будет кому полезна информация. Долго разбирался с i2c на stm8s, в том числе помог и этот пример. В предыдущем посте код будет рабочим, но неправильным, что видно по приложенной картинке. Последний байт 0х00 (пустота) т.к. ведомое устройство уже ничего не отправляет и в коде этот байт никуда не пишеться, а мастер (т.е. сам мк) думает что будет еще 1 байт и, соответственно, продолжает тактировать шину вместо остановки.
Правильный код:
Код:
uint8_t MPU6050ReadReg(uint8_t regaddr)
{
uint8_t tmp;

I2C_GenerateSTART(ENABLE);
while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(MPU6050_Write, I2C_DIRECTION_TX); // Device address and direction
while (!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

I2C_SendData(regaddr); // Mode register
while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_GenerateSTOP(ENABLE); // Generating Stop - Ре-Старт не прокатывает без Стоп-а

I2C_GenerateSTART(ENABLE);
while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(MPU6050_Write, I2C_DIRECTION_RX); // Device address and direction
while (!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

I2C_AcknowledgeConfig(I2C_ACK_NONE); //вместо I2C->CR2 &= ~I2C_CR2_ACK; оба варианта правильные // Sending NACK, so slave will release SDA - Без NACK-а слейв не освобождает линию

while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED));
tmp = I2C_ReceiveData(); // Reading data from the buffer
I2C_GenerateSTOP(ENABLE); // Send STOP Condition

return tmp;
}

В этом случае последний и единственный байт будет получен после того как мы обнулим ACK, как и написано в RM0016 стр. 297-298 (EV6_1). Обязательно нужно поднимать бит CR2 вручную командой I2C->CR2 |= I2C_CR2_ACK;, т.к. при следующем приеме NACK будет отправляться сразу и вместо данных будут нули.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB