Форум РадиоКот https://radiokot.ru/forum/ |
|
stm32f1 + i2c1 help! https://radiokot.ru/forum/viewtopic.php?f=59&t=162032 |
Страница 1 из 1 |
Автор: | Yorlik [ Пн апр 01, 2019 14:04:19 ] |
Заголовок сообщения: | stm32f1 + i2c1 help! |
Помогите разобраться. Пытаюсь запустить i2c на портах 6 и 7 на stm32f103c8t6, все работает регистры статусов меняются, ошибок BERR не выдает, но и ничего не передает на самом деле. Код: #include "stm32f103xb.h"
int main() { // restart afio RCC->APB2RSTR |= RCC_APB2RSTR_AFIORST; // turn on b-pins RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // turn on afio RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; // turn on I2C1 RCC->APB1ENR |= RCC_APB1ENR_I2C1EN; // turn on pins 6, 7 // AF and open-drain and 50MHz GPIOB->CRL |= 0xFF << 24; // set i2c1 freq I2C1->CR2 |= 2; // set ack I2C1->CR1 |= I2C_CR1_ACK; // set Pause I2C1->CCR |= 100; // trise I2C1->TRISE |= 9; // on i2c I2C1->CR1 |= I2C_CR1_PE; // start signal I2C1->CR1 |= I2C_CR1_START; while (!(I2C1->SR1 & I2C_SR1_SB)); (void) I2C1->SR1; I2C1->DR |= 0x27 << 1; while (!(I2C1->SR1 & (I2C_SR1_ADDR))); (void) I2C1->SR1; (void) I2C1->SR2; I2C1->DR |= ('a' & 0xF0) | 0x08 | 0x04 | 0x01; while (!(I2C1->SR1 & (I2C_SR1_BTF))); (void) I2C1->SR1; (void) I2C1->SR2; I2C1->DR |= ('a' & 0xF0) | 0x08 | 0x00 | 0x01; while (!(I2C1->SR1 & (I2C_SR1_BTF))); (void) I2C1->SR1; (void) I2C1->SR2; I2C1->DR |= (('a' & 0x0F) << 4) | 0x08 | 0x04 | 0x01; while (!(I2C1->SR1 & (I2C_SR1_BTF))); (void) I2C1->SR1; (void) I2C1->SR2; I2C1->DR |= (('a' & 0x0F) << 4) | 0x08 | 0x00 | 0x01; while (!(I2C1->SR1 & (I2C_SR1_BTF))); (void) I2C1->SR1; (void) I2C1->SR2; I2C1->CR1 |= I2C_CR1_STOP; while (1); return 0; } |
Автор: | VladislavS [ Вт апр 02, 2019 20:49:58 ] |
Заголовок сообщения: | Re: stm32f1 + i2c1 help! |
RCC_APB2RSTR_AFIORST если нажал, то отпускать надо. Дальше не смотрел. |
Автор: | Frogfot [ Ср апр 03, 2019 20:10:16 ] |
Заголовок сообщения: | Re: stm32f1 + i2c1 help! |
2 Yorlik Что за девайс висит на I2C? По идее он должен отвечать Ack - и STM32 ждёт пока не будет ответ. |
Автор: | Yorlik [ Пт апр 05, 2019 09:10:39 ] |
Заголовок сообщения: | Re: stm32f1 + i2c1 help! |
В том то и дело, устройство отвечает, но остальные байты не передаются, кроме адреса |
Автор: | VladislavS [ Пт апр 05, 2019 09:18:13 ] |
Заголовок сообщения: | Re: stm32f1 + i2c1 help! |
Посмотри пример. I2C не терпит суеты и лишних телодвижений. Код: bool EE_24C::WriteByte(uint16_t adr, uint8_t data)
{ pI2C->CR1 = I2C_CR1_PE | I2C_CR1_START; while(!(pI2C->SR1 & I2C_SR1_SB)); pI2C->DR = w_adr; while(!(pI2C->SR1 & I2C_SR1_ADDR)) { if(pI2C->SR1 & I2C_SR1_AF) { pI2C->CR1 = I2C_CR1_PE | I2C_CR1_STOP; return false; } }; pI2C->SR2; while(!(pI2C->SR1 & I2C_SR1_TXE)); pI2C->DR = adr>>8; while(!(pI2C->SR1 & I2C_SR1_TXE)); pI2C->DR = adr; while(!(pI2C->SR1 & I2C_SR1_TXE)); pI2C->DR = data; while(!((pI2C->SR1 & I2C_SR1_TXE) && (pI2C->SR1 & I2C_SR1_BTF))); pI2C->CR1 = I2C_CR1_PE | I2C_CR1_STOP; return true; } |
Автор: | Yorlik [ Пт апр 05, 2019 10:44:38 ] |
Заголовок сообщения: | Re: stm32f1 + i2c1 help! |
Спасибо! Этот код работает. Странный конечно у stm32 i2c ведь я вроде тоже самое делаю) Добавлено after 35 minutes 54 seconds: Проблема в том, что регистр I2C1->DR сам не отчищается, хотя должен как написано в rm, и поэтому I2C1->DR |= data такая запись отправляла смесь предыдущего байта и этого, решение простое использовать I2C1->DR = data |
Автор: | VladislavS [ Пт апр 05, 2019 12:40:05 ] |
Заголовок сообщения: | Re: stm32f1 + i2c1 help! |
Остановите Землю, я сойду. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |