Перейти к содержанию
    

Chip115

Участник
  • Постов

    44
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о Chip115

  • Звание
    Участник
    Участник

Посетители профиля

1 138 просмотров профиля
  1. Добрый день! Могли бы вы кинуть в меня этой книгой, пожалуйста. 🙂
  2. STM32 + SPI EEPROM

    Всем привет! Пытаюсь написать алгоритм работы с SPI EEPROM, но из-за недостатка опыта сомневаюсь в правильности алгоритмов, потому требуется помощь. Контроллер STM32F103C8 (Reference manual) Память M95M01 (pdf) В общем, начал с низкоуровневых функций. Настройка SPI2, поднятие преываний на прием и окончание передачи. Как я понимаю передача и приём идет одновременно. В интернете полно примеров, но там используются всякие костыли типа while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET); что, откровенно, вызывает кровь из глаз. Хотя мой быдлокодинг еще больше кровоточит. Ну да ладно, ближе к теме. В общем, функция для отправки байта typedef enum { SPI_EEPROM_STATUS_BSY, // Spi is busy SPI_EEPROM_STATUS_RDY } SpiEepromStatus; typedef struct { unsigned spiByteReseived: 1; unsigned spiByteTransmited: 1; } SpiState_TypeDef; SpiEepromStatus ui8EepromSendByte(uint8_t byte) { SpiEepromStatus Status = SPI_EEPROM_STATUS_BSY; if (SPI2->SR & SPI_SR_TXE) { SPI2->DR = byte; Status = SPI_EEPROM_STATUS_RDY; } else Status = SPI_EEPROM_STATUS_BSY; return Status; } Смысл такой, что если циклически вызывать ui8EepromSendByte и чекать что вернула функция, то можно рулить тем, что бы данные отправлялись тогда, когда предыдущие гарантированно уйдут. Такая конструкция приемлема или есть более интересная реализация? Функция прерывания void SPI2_IRQHandler (void) { if (SPI2->SR & SPI_SR_RXNE) { ui8ByteFromSpiEeprom = SPI2->DR; vSetSpiEepromFlag (&SpiState, SPI_BYTE_RECEIVED); } } vSetSpiEepromFlag взводит флаг в битовом поле (через битбанд). Таким образом происходит обмен мессаджами между функциями. Реализованное битовое поле typedef struct { unsigned spiByteReseived: 1; unsigned spiByteTransmited: 1; } SpiState_TypeDef; В целом, цель поднять FAT на SPI EEPROM и определить её как USB, потому в этом контексте, подобная реализация низкоуровневых функций норм? Или же мне отправляемые/принимаемые данные через кольцевой буфер гонять? Или исходящий поток нет смысла через кольцевой буфер гнать? Вообще, общение с EEPROM постраничное? т.е. прежде чем изменить байт (-ты), я должен прочитать всю страницу, изменить нужную информацию и записать вновь?
  3. Спасибо за ответ! Проект был создан не мной, но мне с ним работать. Перенес содержимое папки Windows/Fonts на другую машину (где не открывалось). Все равно ошибка. Откуда альтиум шрифты подтягивает? Что еще может вызвать подобную ошибку?
  4. Всем привет! Столкнулся с проблемой при работе с AD 16-17. При попытке открыть схему вылетает ошибка FontStyleNotFound. PCB открывается нормально. Замечено, что схема частично на листе прогружается, но при любой манипуляции с ней вылетает ошибка. Можно ли как-нибудь сбросить шрифты на стандартные в схеме? Открыл схему на другом компе. Как можно посмотреть все используемые шрифты в проекте? Я только не давно с альтиумом начал работать. Не совсем хорошо ориентируюсь в этой среде.
  5. Всем привет! Необходимо опросить датчик по SSI. Хочу заюзать SPI. По SSI необходимо принять 13 бит. Как мне сформировать 13 инмульсов клока? Камень TMS320F28335. Читаю TMS320x2833x, 2823x Serial Peripheral. Там сказано что в регистре SPICCR есть поля CHAR0 - CHAR3, которые отвечают за длину бит в посылке. Правитльно ли я понимаю, что если я запишу 13 в это поле, то я должен получить 13 клоков с вывода SPI CLK. К сожалению нет возможности предоставить код ((( На текущий момент при передаче чего-либо у меня формируется 16 клоков и значение записанное в CHARx не влияет на клоки.
  6. Всем привет! Столкнулся с акселерометром FXOS8700. Управляется по I2C. Адрес устройства 0х1E. Контроллер STM32L476. Проблема с чтением регистра WHOAMI. (ID устройства). Точнее, в целом проблема чтения данных с устройства. Набросал функцию. В качестве аргумента передаю адрес регистра который намерен считать. uint8_t FXOS8700_ReadByte (uint8_t ui8reg) { uint8_t ui8byteFromReg; HAL_I2C_Master_Transmit (&hi2c3, (0x1E<<1), &ui8reg, 1, 200); HAL_I2C_Master_Receive (&hi2c3, ((0x1E<<1)|0x01), &ui8byteFromReg,1, 200); return ui8byteFromReg; } Как я понял (до этого делов с I2C не имел), для чтения должны придерживаться диаграммы single byte read. вот вырезка из доки. Вот тут непонятки. Адрес имеет длину 7 бит. Я так понял, просто так мы его передать не можем? Надо его сдвинуть влево на бит и тогда подсунуть в функцию HAL_I2C_Master_Transmit . Сначала мы передаем устройству адрес+W, получаем от устройсва AK, затем передаем адрес регистра который будем читать (в нашем случае это 0х0D). После этого опять ожидаем AK. За эту часть отвечает HAL_I2C_Master_Transmit. Затем, (не понял как сгенерить SR) отсылаем адрес + R И после этого ожидаем AK и содержимое регистра 0х0D устройства. Но вот что-то на этом этапе линия данных ложится в нуль, хотя ID != 0. Вот сфотал (по другому не получается) экран с данным от лог. анализатора. При таком подходе, в конце работы ф-ции transmit передается STOP. Работа функции transmit Receive Правильно ли я понял принцип обмена данными с устройством, которое сидит на I2C шине и в чем ошибка?
  7. Доброго времени суток. Возникла проблема. OrCAD Capture выдет ошибку при попытки создать нетлист. #1 WARNING(SPMHNI-192): Device/Symbol check warning detected. [help] WARNING(SPMHNI-194): Symbol 'IN12' for device 'IN-12B_IN12_IN-12B' not found in PSMPATH or must be "dbdoctor"ed. Database has a non-recoverable corruption. Contact Cadence customer support. Что это значит? Сделал футпринт для ИН-12 и хочу его протестить. Набросал простейшую схему. Где-то в начале темы у кого-то была подобная ошибка, но как решили проблему - не нашел
  8. Всем привет! Возникла следующая проблема. После изменения схемы остались старые, ненужные связи элементов проводниками. Можно ли как нибудь настроить программу что бы эти дорожки хотя бы маркировались как ошибочные? Использую OrCAD 16.6.
  9. А нет другого способа? Мол, поставил символ "земля" и на всех листах земля объединена. С VCC это же работает без коннектора.
  10. Всем привет! При разводке платы столкнулся с тем, что цепь GND на плате не объединяется с "земляным" полигоном. Схема занимает три листа. Открыв схему обнаружил что цепи GND в пределах одного листа имеют имя отличное от GND (а точнее GND_16776976). При попытке цепи придать нужное имя, оркад ругается Net Name GND has been applied to more than one schematic nets. Capture will retain the name on one and rename others. Если захожу в свойства цепи и пытаюсь заменить имя цепи на GND, то система вновь присваивает этой цепи адский номер Что нужно сделать, что бы цепи GND объединились? Может проблема с символом "земля", который я создал? По сути нет межстраничного объединения земли. Есть идея соединитель эти цепи через offpage connector, но это как то совсем через колено будет.
  11. Всем привет! Помогите пожалуйста решить проблему. Не могу понять, как в пад-дезайнере сделать срезанный угол у прямоугольника? На сколько я понимаю, надо самому создавать shape, но как это сделать?
  12. Всем привет! Столкнулся с проблемой. Не могу понять, где настраивается расстояние от края платы до меди? Надеюсь я правильно понял назначение ораньжевого прямоугольника, создаваемого при использовании board outline . Скриншот в приложении. И где настраиваются нормы проектирования? И почему не отображаются линии связи цепей питания после добавления компонентов на пп?
  13. Привет! Хочу сделать USB CDC USB2COM. Нашел исходник, реализующий эхо, но я новичок в этой ОСРВ, потому не понимаю многих моментов. При ковырянии в отладчике выяснилось что застревает система в функции IntDefaultHandler. Как выяснить, что вызывает прерывание? В приложении мой стартап. и исходник программы. startup.rar USB_CDC_Echo.rar
×
×
  • Создать...