реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Проблемы по I2C STM32F103RC
Obam
сообщение Mar 1 2017, 14:43
Сообщение #16


Знающий
****

Группа: Участник
Сообщений: 544
Регистрация: 14-11-14
Пользователь №: 83 663



Всё, "надо брать!", в смысле, доделать лабкит на F103ZE. Заинтригован.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 1 2017, 14:59
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 644
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Obam @ Mar 1 2017, 14:51) *
А на 66 кГц, к примеру?

Мне доводилось разгонять до 1 МГц smile3009.gif
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 1 2017, 19:43
Сообщение #18


Знающий
****

Группа: Участник
Сообщений: 544
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(scifi @ Mar 1 2017, 18:59) *
Мне доводилось разгонять до 1 МГц smile3009.gif

Мои искренние поздравления (:
6 постов назад было сообщено, что снижение частоты SCL вызывает проблемы...


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
dimon_rub
сообщение Mar 4 2017, 08:45
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 10-09-16
Пользователь №: 93 282



Извиняюсь. Долго не был в сети. На скрине показано что откуда то появляется непонятные 255+ACK при этом если смотреть пошагово то это приходит в I2C2->DR. Не могу понять что это....
Прикрепленное изображение


По поводу частоты, здесь мне нужна однозначно 100КГц так как одно из устройств скофигурировано на нее. Так что 400 да же пробовать не хочется.
Попробую поллинг и отпишусь. Может у кого есть рабочий кусок работы с прерываниями. ЗАРАНЕЕ БЛОГОДАРЕН
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 4 2017, 09:33
Сообщение #20


Знающий
****

Группа: Участник
Сообщений: 544
Регистрация: 14-11-14
Пользователь №: 83 663



Вот так бы изначально и писали, что штатно подтверждены байты 255, а не DR=255+ACK.
Далее... по сигналлограмме криминалов не видно, каждый байт подтверждён (аппаратно - O'k): адрес ведомого сооответствует ему? адрес данных в ведомом подтверждён ведомым (вашей 24с16)? И если это чтение (судя по сигналлограмме), так может содержимое таково?


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
dimon_rub
сообщение Mar 4 2017, 09:48
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 10-09-16
Пользователь №: 93 282



Цитата(Obam @ Mar 4 2017, 09:33) *
Вот так бы изначально и писали, что штатно подтверждены байты 255, а не DR=255+ACK.
Далее... по сигналлограмме криминалов не видно, каждый байт подтверждён (аппаратно - O'k): адрес ведомого сооответствует ему? адрес данных в ведомом подтверждён ведомым (вашей 24с16)? И если это чтение (судя по сигналлограмме), так может содержимое таково?


Да. Адресс ведомого по даташиту 0xA0. При чтении соответственно 0xA1. Читаем соответственно 1 байт в памяти. (Это M24C16 память). Очень смущает это 255+ACK. Ведь по идее этого быть не должно. Содержимое наверно таково и есть так как писать еще не пробовал и соответственно чистая память при инициализации может быть такова
Go to the top of the page
 
+Quote Post
MoskWin32
сообщение Mar 4 2017, 11:20
Сообщение #22





Группа: Участник
Сообщений: 7
Регистрация: 13-12-12
Пользователь №: 74 834



Цитата(dimon_rub @ Mar 4 2017, 12:48) *
и соответственно чистая память при инициализации может быть такова


так в datasheet же так и сказано:
Цитата
The device is delivered with all the memory array bits set to 1 (each byte contains FFh)
Go to the top of the page
 
+Quote Post
dimon_rub
сообщение Mar 4 2017, 12:18
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 10-09-16
Пользователь №: 93 282



Цитата(MoskWin32 @ Mar 4 2017, 11:20) *
так в datasheet же так и сказано:


Это я увидел.
Пытаюсь поднять на поллинге че то нет падения SCL при старте....
CODE
void I2C_Initial(void)
{
I2C_InitTypeDef I2C_InitStructure;

I2C_DeInit(I2C2);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; //I2C_DutyCycle_16_9;
I2C_InitStructure.I2C_OwnAddress1 = 0x01;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 100000; /* 100kHz */

I2C_Cmd(I2C2, ENABLE);
I2C_Init(I2C2, &I2C_InitStructure);
}

void I2C_ByteWrite(u8* pBuffer, u8 WriteAddr)
{
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
WC_EEPROM_WRITE();
/* шлем старт */
I2C_GenerateSTART(I2C2, ENABLE);
/* ждем подтверждение */
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
/* шлем адрес */
I2C_Send7bitAddress(I2C2, I2C_ADDRESS(I2C_ADDRESS_M24C16, I2C_MODE_WRITE), I2C_Direction_Transmitter);
/* ждем подтверждение */
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/* шлем адрес регистра */
I2C_SendData(I2C2, 0x01);
/* ждем окончания передачи */
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/* шлем данные */
I2C_SendData(I2C2, *pBuffer);
/* ждем */
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/* шлем стоп */
I2C_GenerateSTOP(I2C2, ENABLE);
WC_EEPROM_READ();
}

void I2C_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead)
{
/* ждем пока шина не освободится */
while (I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
/* шлем старт */
I2C_GenerateSTART(I2C2, ENABLE);
//I2C2->CR1 |= CR1_START_Set;
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
/* шлем адрес */
I2C_Send7bitAddress(I2C2, I2C_ADDRESS(I2C_ADDRESS_M24C16, I2C_MODE_READ), I2C_Direction_Transmitter);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/* шлем адрес чтения */
I2C_SendData(I2C2, ReadAddr);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

/* шлем старт второй раз */
I2C_GenerateSTART(I2C2, ENABLE);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
/* шлем адрес */
I2C_Send7bitAddress(I2C2, I2C_ADDRESS(I2C_ADDRESS_M24C16, I2C_MODE_READ), I2C_Direction_Transmitter);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/* Пока есть что читать */
while (NumByteToRead)
{
if (NumByteToRead == 1)
{
I2C_AcknowledgeConfig(I2C2, DISABLE);
I2C_GenerateSTOP(I2C2, ENABLE);
}
if (I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED))
{
*pBuffer = I2C_ReceiveData(I2C2);
pBuffer++;
NumByteToRead--;
}
}
I2C_AcknowledgeConfig(I2C2, ENABLE);
}


Сообщение отредактировал IgorKossak - Mar 4 2017, 17:05
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
dimon_rub
сообщение Mar 4 2017, 13:53
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 10-09-16
Пользователь №: 93 282



SCL появилось (БЫЛО ВКЛЮЧЕНО ТАКТИРОВАНИЕ USART3). Бьюсь дальше. Пишет вроде красиво, чтение пока хромает
Go to the top of the page
 
+Quote Post
dimon_rub
сообщение Mar 4 2017, 15:46
Сообщение #25


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 10-09-16
Пользователь №: 93 282



Ну вроде все работает. Выкладываю код может кому пригодится.
Поллинг I2C M24C16.

CODE
void I2C_Initial(void)
{
I2C_InitTypeDef I2C_InitStructure;

I2C_DeInit(I2C2);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; //I2C_DutyCycle_16_9;
I2C_InitStructure.I2C_OwnAddress1 = 0x01;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 100000; /* 100kHz */
I2C_Cmd(I2C2, ENABLE);

I2C_Init(I2C2, &I2C_InitStructure);
}

void I2C_ByteWrite(u8* pBuffer, u8 WriteAddr)
{
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
WC_EEPROM_WRITE();
/* шлем старт */
I2C_GenerateSTART(I2C2, ENABLE);
/* ждем подтверждение */
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
/* шлем адрес */
I2C_Send7bitAddress(I2C2, I2C_ADDRESS_M24C16, I2C_Direction_Transmitter);
/* ждем подтверждение */
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/* шлем адрес регистра */
I2C_SendData(I2C2, WriteAddr);
/* ждем окончания передачи */
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/* шлем данные */
I2C_SendData(I2C2, *pBuffer);
/* ждем */
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/* шлем стоп */
I2C_GenerateSTOP(I2C2, ENABLE);
WC_EEPROM_READ();
}

void I2C_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead)
{
/* ждем пока шина не освободится */
while (I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
/* шлем старт */
I2C_GenerateSTART(I2C2, ENABLE);
//I2C2->CR1 |= CR1_START_Set;
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
/* шлем адрес */
I2C_Send7bitAddress(I2C2, I2C_ADDRESS_M24C16, I2C_Direction_Transmitter);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/* шлем адрес чтения */
I2C_SendData(I2C2, ReadAddr);
//I2C2->DR = 0x01;
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

///* Для очистки EV6 запускаем модуль снова */
//I2C_Cmd(I2C2, ENABLE);

/* шлем старт второй раз */
I2C_GenerateSTART(I2C2, ENABLE);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
/* шлем адрес */
I2C_Send7bitAddress(I2C2, I2C_ADDRESS_M24C16, I2C_Direction_Receiver);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

while (NumByteToRead)
{
if (NumByteToRead == 1)
{
I2C_AcknowledgeConfig(I2C2, DISABLE);
I2C_GenerateSTOP(I2C2, ENABLE);
}
if (I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED))
{
*pBuffer = I2C2->DR;
pBuffer++;
NumByteToRead--;
}
}
I2C_AcknowledgeConfig(I2C2, ENABLE);
}


Остался один вопрос. Или я уже не соображаю или ....
КАК обратится к ячейки памяти если максимальный адрес 0xFFF а у нас соответственно можно в функцию I2C_SendData
только 8 бит. Даже при передаче по 10бит не получается как то.

Сообщение отредактировал IgorKossak - Mar 4 2017, 17:05
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 4 2017, 18:41
Сообщение #26


Знающий
****

Группа: Участник
Сообщений: 544
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(dimon_rub @ Mar 4 2017, 19:46) *
Остался один вопрос. Или я уже не соображаю или ....
КАК обратится к ячейки памяти если максимальный адрес 0xFFF а у нас соответственно можно в функцию I2C_SendData
только 8 бит. Даже при передаче по 10бит не получается как то.

В выходные надо отдыхать... I2C байтовый интерфейс: "all addresses and data words are serially transmitted to and from the EEPROM in 8-bit words."


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Mar 4 2017, 18:42
Сообщение #27


Знающий
****

Группа: Участник
Сообщений: 616
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(dimon_rub @ Mar 4 2017, 16:46) *
Остался один вопрос. Или я уже не соображаю или ....
КАК обратится к ячейки памяти если максимальный адрес 0xFFF а у нас соответственно можно в функцию I2C_SendData
только 8 бит. Даже при передаче по 10бит не получается как то.

Старшие биты идут в адрес устройства.
Go to the top of the page
 
+Quote Post
dimon_rub
сообщение Mar 4 2017, 22:16
Сообщение #28


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 10-09-16
Пользователь №: 93 282



ВСЕМ ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ. В ближайщее время сделаю на прерываниях отпишусь
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd May 2017 - 01:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01521 секунд с 7
ELECTRONIX ©2004-2016