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

    

Chip115

Участник
  • Публикаций

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

  • Посещение

Репутация

0 Обычный

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

  • Звание
    Участник
  1. 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 постраничное? т.е. прежде чем изменить байт (-ты), я должен прочитать всю страницу, изменить нужную информацию и записать вновь?
  2. Ошибки работы Altium Designer 15

    Спасибо за ответ! Проект был создан не мной, но мне с ним работать. Перенес содержимое папки Windows/Fonts на другую машину (где не открывалось). Все равно ошибка. Откуда альтиум шрифты подтягивает? Что еще может вызвать подобную ошибку?
  3. Ошибки работы Altium Designer 15

    Всем привет! Столкнулся с проблемой при работе с AD 16-17. При попытке открыть схему вылетает ошибка FontStyleNotFound. PCB открывается нормально. Замечено, что схема частично на листе прогружается, но при любой манипуляции с ней вылетает ошибка. Можно ли как-нибудь сбросить шрифты на стандартные в схеме? Открыл схему на другом компе. Как можно посмотреть все используемые шрифты в проекте? Я только не давно с альтиумом начал работать. Не совсем хорошо ориентируюсь в этой среде.
  4. Всем привет! Необходимо опросить датчик по SSI. Хочу заюзать SPI. По SSI необходимо принять 13 бит. Как мне сформировать 13 инмульсов клока? Камень TMS320F28335. Читаю TMS320x2833x, 2823x Serial Peripheral. Там сказано что в регистре SPICCR есть поля CHAR0 - CHAR3, которые отвечают за длину бит в посылке. Правитльно ли я понимаю, что если я запишу 13 в это поле, то я должен получить 13 клоков с вывода SPI CLK. К сожалению нет возможности предоставить код ((( На текущий момент при передаче чего-либо у меня формируется 16 клоков и значение записанное в CHARx не влияет на клоки.
  5. Всем привет! Столкнулся с акселерометром 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 шине и в чем ошибка?
  6. Горячая линия по САПР Cadence Allegro

    Доброго времени суток. Возникла проблема. 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 и хочу его протестить. Набросал простейшую схему. Где-то в начале темы у кого-то была подобная ошибка, но как решили проблему - не нашел
  7. Горячая линия по САПР Cadence Allegro

    Всем привет! Возникла следующая проблема. После изменения схемы остались старые, ненужные связи элементов проводниками. Можно ли как нибудь настроить программу что бы эти дорожки хотя бы маркировались как ошибочные? Использую OrCAD 16.6.
  8. Цитата(alexa1973 @ May 2 2013, 13:07) Такие проблемы и возникают, когда начинают соединить "глобальные" символы типа земли , с портами или off page connectors. А Вы сделали свою землю как New -symbol - power/gnd? Если да, то этот символ "глобальный". Понял. Спасибо за разъяснение!
  9. Цитата(bsvc963 @ May 2 2013, 13:00) Place->Off Page Connector для цепи GND на разных листах А нет другого способа? Мол, поставил символ "земля" и на всех листах земля объединена. С 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. Горячая линия по САПР Cadence Allegro

    Всем привет! Помогите пожалуйста решить проблему. Не могу понять, как в пад-дезайнере сделать срезанный угол у прямоугольника? На сколько я понимаю, надо самому создавать shape, но как это сделать?
  12. Горячая линия по САПР Cadence Allegro

    Всем привет! Столкнулся с проблемой. Не могу понять, где настраивается расстояние от края платы до меди? Надеюсь я правильно понял назначение ораньжевого прямоугольника, создаваемого при использовании board outline . Скриншот в приложении. И где настраиваются нормы проектирования? И почему не отображаются линии связи цепей питания после добавления компонентов на пп?
  13. Привет! Хочу сделать USB CDC USB2COM. Нашел исходник, реализующий эхо, но я новичок в этой ОСРВ, потому не понимаю многих моментов. При ковырянии в отладчике выяснилось что застревает система в функции IntDefaultHandler. Как выяснить, что вызывает прерывание? В приложении мой стартап. и исходник программы.
  14. Stellaris LM3S9B96, CAN

    Так. Вроде бы раскурил пример для платы EK-LM3S8962. Вырезал то, что надо. Не понимаю, почему не работает? Что я упустил? И до удаления ненужных функций не работала (( Как я понял, пример был заточен на получение данных по CAN, потом данные изменялись и отправлялись в ответ. И так снова. Как вообще работает машина? Посылка должна уйти при вызове функции CANMessageSet ? Не надо там как то пинать еще? Я не стал подключать прерывания. Может это как то повлияло? вот код в приложении