Obam 33 1 марта, 2017 Опубликовано 1 марта, 2017 · Жалоба Всё, "надо брать!", в смысле, доделать лабкит на F103ZE. Заинтригован. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 1 марта, 2017 Опубликовано 1 марта, 2017 · Жалоба А на 66 кГц, к примеру? Мне доводилось разгонять до 1 МГц :smile3009: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 33 1 марта, 2017 Опубликовано 1 марта, 2017 · Жалоба Мне доводилось разгонять до 1 МГц :smile3009: Мои искренние поздравления (: 6 постов назад было сообщено, что снижение частоты SCL вызывает проблемы... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimon_rub 0 4 марта, 2017 Опубликовано 4 марта, 2017 · Жалоба Извиняюсь. Долго не был в сети. На скрине показано что откуда то появляется непонятные 255+ACK при этом если смотреть пошагово то это приходит в I2C2->DR. Не могу понять что это.... По поводу частоты, здесь мне нужна однозначно 100КГц так как одно из устройств скофигурировано на нее. Так что 400 да же пробовать не хочется. Попробую поллинг и отпишусь. Может у кого есть рабочий кусок работы с прерываниями. ЗАРАНЕЕ БЛОГОДАРЕН Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 33 4 марта, 2017 Опубликовано 4 марта, 2017 · Жалоба Вот так бы изначально и писали, что штатно подтверждены байты 255, а не DR=255+ACK. Далее... по сигналлограмме криминалов не видно, каждый байт подтверждён (аппаратно - O'k): адрес ведомого сооответствует ему? адрес данных в ведомом подтверждён ведомым (вашей 24с16)? И если это чтение (судя по сигналлограмме), так может содержимое таково? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimon_rub 0 4 марта, 2017 Опубликовано 4 марта, 2017 · Жалоба Вот так бы изначально и писали, что штатно подтверждены байты 255, а не DR=255+ACK. Далее... по сигналлограмме криминалов не видно, каждый байт подтверждён (аппаратно - O'k): адрес ведомого сооответствует ему? адрес данных в ведомом подтверждён ведомым (вашей 24с16)? И если это чтение (судя по сигналлограмме), так может содержимое таково? Да. Адресс ведомого по даташиту 0xA0. При чтении соответственно 0xA1. Читаем соответственно 1 байт в памяти. (Это M24C16 память). Очень смущает это 255+ACK. Ведь по идее этого быть не должно. Содержимое наверно таково и есть так как писать еще не пробовал и соответственно чистая память при инициализации может быть такова Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex32 0 4 марта, 2017 Опубликовано 4 марта, 2017 · Жалоба и соответственно чистая память при инициализации может быть такова так в datasheet же так и сказано: The device is delivered with all the memory array bits set to 1 (each byte contains FFh) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimon_rub 0 4 марта, 2017 Опубликовано 4 марта, 2017 (изменено) · Жалоба так в datasheet же так и сказано: Это я увидел. Пытаюсь поднять на поллинге че то нет падения SCL при старте.... 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); } Изменено 4 марта, 2017 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimon_rub 0 4 марта, 2017 Опубликовано 4 марта, 2017 · Жалоба SCL появилось (БЫЛО ВКЛЮЧЕНО ТАКТИРОВАНИЕ USART3). Бьюсь дальше. Пишет вроде красиво, чтение пока хромает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimon_rub 0 4 марта, 2017 Опубликовано 4 марта, 2017 (изменено) · Жалоба Ну вроде все работает. Выкладываю код может кому пригодится. Поллинг I2C M24C16. 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бит не получается как то. Изменено 4 марта, 2017 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 33 4 марта, 2017 Опубликовано 4 марта, 2017 · Жалоба Остался один вопрос. Или я уже не соображаю или .... КАК обратится к ячейки памяти если максимальный адрес 0xFFF а у нас соответственно можно в функцию I2C_SendData только 8 бит. Даже при передаче по 10бит не получается как то. В выходные надо отдыхать... I2C байтовый интерфейс: "all addresses and data words are serially transmitted to and from the EEPROM in 8-bit words." Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 4 марта, 2017 Опубликовано 4 марта, 2017 · Жалоба Остался один вопрос. Или я уже не соображаю или .... КАК обратится к ячейки памяти если максимальный адрес 0xFFF а у нас соответственно можно в функцию I2C_SendData только 8 бит. Даже при передаче по 10бит не получается как то. Старшие биты идут в адрес устройства. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimon_rub 0 4 марта, 2017 Опубликовано 4 марта, 2017 · Жалоба ВСЕМ ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ. В ближайщее время сделаю на прерываниях отпишусь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться