• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!

Поиск по сайту

Результаты поиска по тегам 'SPI'.

  • Поиск по тегам

    Введите теги через запятую.
  • Поиск по автору

Тип публикаций


Категории и разделы

  • Вопрос-Ответ. Для начинающих
    • Песочница (Q&A)
    • Дайте схему!
    • Школьникам и студентам
    • Начинающим
    • Паяльник TV
    • Обсуждение материалов с сайта
  • Радиоэлектроника для профессионалов
    • Световые эффекты и LED
    • Роботы и модели на ДУ-управлении
    • Автоматика
    • Самодельные устройства к компьютеру
    • Программное обеспечение
    • Автомобильная электроника
    • Системы охраны и наблюдения. Личная безопасность
    • Питание
    • Электрика
    • Промышленная электроника
    • Ремонт
    • Металлоискатели
    • Измерительная техника
    • Мастерская радиолюбителя
    • Сотовая связь
    • Спутниковое ТВ
    • КВ и УКВ радиосвязь
    • Жучки
    • Телефония и фрикинг
    • Высокое напряжение
    • Идеи и технологии будущего
    • Справочная радиоэлементов
    • Литература
    • Разное
  • Аудио
    • FAQ, Технологии и компоненты
    • Для начинающих
    • Источники звука
    • Предусилители, темброблоки, фильтры
    • Питание аудио аппаратуры
    • Усилители мощности
    • Акустические системы
    • Авто-аудио
    • Ламповая техника
    • Гитарное оборудование
    • Прочее
  • Микроконтроллеры
    • МК для начинающих
    • AVR
    • PIC
    • STM32
    • Arduino и Raspberry Pi
    • ПЛИС
    • Другие микроконтроллеры и семейства
    • Алгоритмы
    • Программаторы и отладочные модули
    • Периферия и внешние устройства
    • Разное
  • Товары и услуги
    • Коммерческие предложения
    • Продам-Отдам, Услуги
    • Куплю
    • Уголок потребителя
    • Вакансии и разовая работа
    • Наши обзоры и тесты
  • Разное
    • Конкурсы сайта с призами
    • Сайт Паяльник и форум
    • Курилка
    • Технический английский (English)
    • Наши проекты для Android и Web
    • FAQ (Архив)
    • Личные блоги
    • Корзина
    • Вопросы с VK
  • ATX->ЛБП Переделки
  • Юмор в youtube Киловольты юмора
  • Надежность и группы продавцов Радиолюбительская доска объявлений exDIY
  • разные темы Переделки

Блоги

Нет результатов для отображения.

Нет результатов для отображения.

Местоположения

  • Пользователи форума

Группа


ICQ


Skype


Интересы


Город


Сфера радиоэлектроники


Оборудование

Найдено 31 результат

  1. Чтение температуры MAX6675

    Помогите, разобраться. Пытаюсь считать данные с модуля на max6675. #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_spi.h" float temp; u16 MSBLSB; volatile uint32_t ticks_delay = 0; void SysTick_Handler(void) { ticks_delay++; } void delay(uint32_t milliseconds) { uint32_t start = ticks_delay; while((ticks_delay - start) < milliseconds); } int main(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); SPI_StructInit(&SPI_InitStructure); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_RxOnly; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128; SPI_Init(SPI1, &SPI_InitStructure); SPI_Cmd(SPI1, ENABLE); SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE); NVIC_EnableIRQ(SPI1_IRQn); SysTick_Config(SystemCoreClock/1000); while(1) { temp = (MSBLSB >> 3); temp = temp * 0.25; } } void SPI1_IRQHandler (){ if (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==SET) { GPIOA->BSRR = GPIO_BSRR_BR4; MSBLSB = SPI_I2S_ReceiveData(SPI1); delay(2000); GPIOA->BSRR = GPIO_BSRR_BS4; } } Ничего хорошего пока не получилось. Код собирал по кусочкам со всего интернета(. 1. Правильно ли я настроил SPI? 2. Как преобразовать полученные данные из регистра DR в температуру? С битовыми операциями, пока туго... 3. Может кто нибудь даст пример? Прошу сильно не пинать.
  2. Добрый день! Столкнулся с такой проблемой, пытаюсь взаимодействовать с чипом AFE4300 по SPI. В дотащите указано, что уровень сигнала 2 - 3 вольта. Подключаю к nrf51 (использует уровень 3.3 вольта), ресетю и пытаюсь прочитать дефолтное значение регистра (0x01C3), в итоге получаю 0xFFFF. Перепроверил на Arduino Mega 2560, где уровень сигнала 5 вольт (подключил напрямую без level shifter) и считал свои дефолтные значения. Попробовал также считать другие 4 регистра, все также отлично считалось. Вот теперь не пойму, в дотащите указано не верно или у меня что-то не то. Еще вопрос про согласовать уровней TXB0108. Пытался через нее прокинуть сигнал от nrf51 (3.3v) на afe4300. Питание А - 3.3в, каналы А к nrf51, питание Б 5в, каналы Б к afe4300, OE к 3.3в. Не завелось, даже анализатор говорит, что MOSI шлет 0xFF, вместо реальных данных. Земля везде общая. Правда есть оговорка, как данный уровень ко мне приехал я мог по ошибке запитать Б 3 вольтами, а А 5 вольтами. Но даташит на него говорит, что когда А > Б, это не повреждает чип, хотя А должно быть до 3.6 вольт. Еще мог OE подключить к 5 вольтам. В общем, могли ли мои неразумные операции вывести его из строя??? Еще в даташите указано, что неиспользуемые каналы надо подключить либо к питанию, либо к земле. Это может влиять на то, что я сейчас получаю?
  3. Всем привет. Существуют ли готовые модули для измерения мгновенных значений тока и напряжения (ток до 100 А, напряжение до 250 вольт)? Т.е. измерять нужно с частотой 1000-5000 герц, точность 14-16 бит, связь по SPI лучше всего. Вообще нужно хотя-бы 4 канала по току и 4 по напряжению. Но лучше, чтобы можно было на одну шину ставить несколько модулей, расширяя количество каналов. Обрабатывать данные собираюсь на STM32F104 (хотя с ним никогда не работал) или Arduino Due, но это не важно. Понятно что можно взять АЦП и шунт или делитель напряжения, но хотелось бы готовый модуль и уже с оптической развязкой. Подскажите если кто сталкивался.
  4. Здравствуйте поверхностный поиск в Яндексе не дал результатов решил обратится к вам суть в следующем: к мк с логикой 5в подключена карта памяти по spi с логикой 3.3в через буферный элемент здесь все в порядке поскольку сигнал от карты памяти 3.3в из за длинны шнура он теряется и становится ниже уровня лог 1 контроллера 5в вопрос как простым методом усилить его до 5 вольт чтоб он не терялся предполагаю биполярным транзистором но по какой схеме? у меня есть такой он подойдет? http://uamper.com/products/datasheet/2N2222.pdf благодарю.
  5. STM32F1 SPI & RC-522(RFID)

    Использую библиотеку HAL Вроде поднял SPI (как проверить не знаю) . Пытаюсь переписать существующию библиотеку для ардуино под стм но все что выдает SPI либо 0x00 либо 0xFF =( иногда пробегают цифры но это скорее случайность. Может кто объяснить в чем может быть причина? SS pin управляется железом. если есть время сегодня то - скайп Discord teamspeak Radmin - буду признателен за помощь - достаточно результата в правильном считывание регистров или ткнуть носом что идет не так. Для начала делаю без прирываний и DMA Использую мк - stm32f103c8t6 модуль : rc-522 - данные отправляю через USB в ПК KEil 5 + cubeMX последней версии. Код процедур прилагаю.
  6. Пытаюсь разобраться с ili9341 брал тут на пин LED и VCC подаю 3.3В с 2х ног ПЛИС Попытка получить ответ по команде D3h ... в ответ молчание (((( Кто работал с этим дисплеем, что делаю не так ?
  7. SPI PIC

    Пытаюсь реализовать SPI, вот только никак не могу скомпилить. ошибка странная.... Строчка кода. Синтаксис на неё не ругается... Что не так????
  8. Добрый день, столкнулся с проблемой на микроконтроллере AVR32UC3C0512, мне необходимо передать сообщение по SPI на микросхему TLE6208-6G и одновременно с этой передачей считать ответ. Разница в передаче и ответе на диаграмме: при передаче с кодом: spi_select_device(&AVR32_SPI0, &SPI_MVK_CS1); spi_write(&AVR32_SPI0, data_buff); while((AVR32_SPI0.cr & AVR32_SPI_SR_TXEMPTY_MASK) != 0) {}; spi_read(&AVR32_SPI0, &result); spi_set_chipselect_delay_bct(&AVR32_SPI0, &SPI_MVK_CS1, CONFIG_SPI_MASTER_DELAY_BCT); spi_deselect_device(&AVR32_SPI0, &SPI_MVK_CS1); код функции spi_write: spi_status_t spi_write(volatile avr32_spi_t *spi, uint16_t data) { uint32_t timeout = SPI_TIMEOUT; while (!(spi->sr & AVR32_SPI_SR_TDRE_MASK)) { if (!timeout--) { return SPI_ERROR_TIMEOUT; //return 0xFFFF; } } spi->tdr = data << AVR32_SPI_TDR_TD_OFFSET; return SPI_OK; } код функции spi_read: spi_status_t spi_read(volatile avr32_spi_t *spi, uint16_t *data) {unsigned int timeout = SPI_TIMEOUT; while ((spi->sr & (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) != (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) { if (!timeout--) { return SPI_ERROR_TIMEOUT; //return 0xFFFF; } } *data = (spi->rdr & 0x0000FFFF) >> AVR32_SPI_RDR_RD_OFFSET; return SPI_OK; } в result 0. хотя отправляю не 0 и плата отрабатывает верно (необходимые светодиоды светятся). Посылка осуществляется в цикле. На осциллографе я вижу все эти пакеты, даже ответ, но мне нужно его прочитать, что не получается сделать. Что может быть не так? Как получить верный ответ, пробовал даже оставлять от кода только строчки отправки и сразу чтение из регистра без задержек но ничего не помогло.. Пробовал также закольцевать SPI без изменения кода программы. ответ вижу передается через UART.
  9. <p>Доброго времени суток. Недавно решил заняться изучением AVR. Начал с изучения периферии, и вот остановилься на интерфейсе SPI. Опыты, пока что провожу в Proteus, подключая к МК виртуальный SPI Debugger. Когда МК в режиме Master то все отлично, байты отправляются и принимаются как надо, но когда МК в режиме Slave (Debugger соответственно Master) то в некоторых режимах SPI, МК передает какую-то кашу. Конкретнее: я передаю в МК(ATmega328P) и хочу считать из МК любое число (пусть и там и там будет 0x66), так вот это удается сделать только в режимах 1 и 3 (то есть только когда CPHA=1), при CPHA=0, МК передает данные с опозданием на 1 бит, или вовсе неправильно, что видно на графиках( зеленый - MOSI, красный - MISO, желтый - SCK, бирюзовый - SS). Вопрос: почему так происходит? Это просто глюк Proteus над которым не стоит заморачиватся или все же моя ошибка? Вот код: #define F_CPU 16000000UL #include <avr/io.h> #include <avr/interrupt.h> #define SPI_PORTX PORTB #define SPI_DDRX DDRB #define SPI_MISO 4 #define SPI_MOSI 3 #define SPI_SCK 5 #define SPI_SS 2 void SPI_Init(void) { SPI_DDRX|=(1<<SPI_MISO); SPCR|=(1<<SPIE)|(1<<SPE)|(0<<DORD)|(0<<MSTR)|(1<<CPOL)|(1<<CPHA)|(0<<SPR1)|(0<<SPR0); SPSR|=(0<<SPI2X); } ISR(SPI_STC_vect) { SPDR=0x66; } int main(void) { SPI_Init(); sei(); while (1) { } }
  10. Написал слой абстракции для мастера SPI, как программного так и аппаратного. Кому не лень посмотрите что можно исправить или доработать. Единственное, что мне не нравится, что avr-gcc ругается warning'ом на неинициализированную переменную. Я-то знаю, что после 9 сдвигов в ней не останется ни одного родного бита, но как это объяснить компилятору? char SPI_send(char data){ char res,i=7; spi.zip
  11. Здравствуйте, Столкнулся с непонятной для меня проблемой запуска графического контроллера FT800 через 1986ВЕ1Т. Вся работа производится с отладочными платами LDM-HELPER-K1986BE1QI-FULL и VM800C43A-D. Среда программирования Keil 5. Работаю руководствуясь данной статьей и демонстрационным примером для ARM. После инициализации, управляющий конnроллер должен получить от FT800 идентификатор 0x7C, который говорит о том что инициализация прошла успешно и можно работать дальше. Проблема состоит в том, что ничего подобного он не получает. Я больше склоняюсь к тому, что неправильно настроил SPI, вследствие чего 1986ВЕ1Т шлет некорректные команды. Отладочная плата с FT800 работает, проверяли подключив к плате ардуино. Схема подключения на картинке, справа графический контроллер, слева 1986ВЕ1: void SPI1_Init(void) //инициализация SPI { SSP_InitTypeDef SSP_InitStructure; PORT_InitTypeDef GPIO_user_ini; RST_CLK_PCLKcmd(PCLK_BIT(MDR_SSP1_BASE), ENABLE); RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTC , ENABLE); GPIO_user_ini.PORT_Pin = PORT_Pin_5 | PORT_Pin_6 | PORT_Pin_7; GPIO_user_ini.PORT_FUNC = PORT_FUNC_ALTER; GPIO_user_ini.PORT_MODE = PORT_MODE_DIGITAL; GPIO_user_ini.PORT_SPEED = PORT_SPEED_SLOW; GPIO_user_ini.PORT_OE = PORT_OE_OUT; PORT_Init(MDR_PORTC, &GPIO_user_ini); SSP_DeInit(MDR_SSP1); SSP_BRGInit(MDR_SSP1, SSP_HCLKdiv1); SSP_InitStructure.SSP_SCR = 0x10; SSP_InitStructure.SSP_CPSDVSR = 12; SSP_InitStructure.SSP_Mode = SSP_ModeMaster; SSP_InitStructure.SSP_WordLength = SSP_WordLength8b; SSP_InitStructure.SSP_SPH = SSP_SPH_1Edge; SSP_InitStructure.SSP_SPO = SSP_SPO_Low; SSP_InitStructure.SSP_FRF = SSP_FRF_SPI_Motorola; SSP_InitStructure.SSP_HardwareFlowControl = SSP_HardwareFlowControl_SSE; SSP_Init(MDR_SSP1, &SSP_InitStructure); SSP_ITConfig(MDR_SSP1, SSP_IT_RX | SSP_IT_RT | SSP_IT_TX | SSP_IT_ROR, ENABLE); SSP_Cmd(MDR_SSP1, ENABLE); } void ft800cmdWrite(unsigned char ftCommand) //функция для отправки команды по SPI { unsigned char cZero = 0x00; CS_RESET; SSP_SendData(MDR_SSP1, ftCommand); // Отправляем команду SSP_SendData(MDR_SSP1, cZero); // Отправляем первый нулевой байт SSP_SendData(MDR_SSP1, cZero); // Отправляем второй нулевой байт //CS_SET; // тут почему то когда перевожу CS на высокий уровень, ничего не работает, и дисплей не включается } //---------------------------------------* unsigned char ft800memRead8(unsigned long ftAddress) // Здесь происходит чтение идентификатора REG ID для проверки корректного завершения этапа инициализации { unsigned char ftData8 = ZERO; // Place-holder for 8-bits being read unsigned char cTempAddr[3]; // FT800 Memory Address unsigned char cZeroFill = ZERO; // Dummy byte cTempAddr[2] = (char) (ftAddress >> 16) | MEM_READ; // Compose the command and address to send cTempAddr[1] = (char) (ftAddress >> 8); // middle byte cTempAddr[0] = (char) (ftAddress); // low byte CS_RESET; // Set chip select low for (i = 2; i >= 0; i--) { SSP_SendData(MDR_SSP1, cTempAddr[i]); // Send Memory Write plus high address byte } SSP_SendData(MDR_SSP1, cZeroFill); // Send dummy byte for (j = 0; j < sizeof(ftData8); j++) // Start with least significant byte { while (SSP_GetFlagStatus(MDR_SSP1, SSP_FLAG_BSY) == 1){} if (SSP_GetFlagStatus(MDR_SSP1, SSP_FLAG_RNE) == 1) { ftData8 = SSP_ReceiveData(MDR_SSP1); // Receive data byte } } CS_SET; // Set chip select high return ftData8; Return 8-bits } //--------------------------------------------------------- //--------------------------------------------------------- //Тут начинается основная программа. Init_PORT_INT_PD(); //Инициализация портов PD, CS, INT// SPI1_Init(); //Инициализация SPI PD_SET; // формируем delay_ms(20); // импульс PD_RESET; // длительностью delay_ms(20); // 20 мс PD_SET; // в активном режиме на линии PD всегда высокий уровень // Дисплей включается и без формирования этого импульса, главное // что бы в PD оставался высокий уровень ft800cmdWrite(FT800_ACTIVE); // тут шлем команды FT800_ACTIVE = 0х00, delay_ms(5); // FT800_CLKEXT = 0x44 ft800cmdWrite(FT800_CLKEXT); // FT800_CLK48M = 0x62 delay_ms(5); // между ними 5 мс для того чтобы FT800 ft800cmdWrite(FT800_CLK48M); // обрабатывать команды delay_ms(5); if (ft800memRead8(REG_ID) != 0x7C) // чтение идентификатора REG ID для проверки корректного завершения этапа инициализации { while(1) {LED0_ON;} //если не получаем данный идентификатор, то нету смысла продолжать дальше } При включении дисплей загорается белым цветом и больше ничего не происходит.
  12. Здравствуйте. Хочу воспользоваться стандартным, 7-контактным SATA кабелем для питания (около 1 Ампер) и для связи (SPI, duplex) с устройством. 1) Подскажите пожалуйста, почему в документации на кабель написано, что сопротивление проводника 2 Ома ? Почему так много ? Да и формулировка странная - "Conductive ResistOR", а не "resistance". Даташит, вторая страница: http://www.molex.com...85610014_sd.pdf 2) Как бы вы скомбинировали SPI интерфейс с питанием в SATA кабеле ? Тоесть, в кабеле есть две экранированные пары и три провода отдельно. В даташите, на второй странице. Как будет правильно разделить три сигнальных провода SPI по двум экранированным парам ? А может и не надо пихать сигнальные провода именно по экранированным парам...
  13. Добрый день (утро/ночь)! Начну с того, что я полный чайник в электронике, и кроме законов Ома и кирхгофа, мало что понимаю в этой теме. Но есть у меня очень большое желание осилить хоть какой-нибудь микроконтроллер, и выбор мой пал на платку Arduino Uno, счастливым обладателем которой я сейчас являюсь Перехожу к насущной проблеме. Имеется Ардуино и EEPROM пр-ва Microchip с интерфейсом SPI, а также исходный код тьюториала работы с EEPROM, который я слегка переделал под мою конкретную микросхему (тьюториал сначала пишет в EEPROM возрастающую последовательность, а потом считывает её в основном цикле и выводит значения в последовательный порт, изначально код был для Атмеловской микросхемы, отличного от моей объёма). Назовём это устройство (MK + EEPROM) У1. По какой-то причине, читаю я совсем не то, что записал. Вопрос в том, как такую ситуацию отлаживать? Понятно, что отладка заключается в проверке соединений, вдумчивого чтения даташита и ещё более внимательного чтения исходника (который в сообществе, собравшемся вокруг проекта Ардуино принято писать аж на C++!). Но мне хотелось бы также иметь возможность мониторить шину физически. На осциллоскоп я пока не накопил, и хочу сделать простое устройство (У2) на основе того же Atmega328P, который позволил бы мониторить последовательность импульсов фиксированной длинны через аналоговый (или цифровой...) вход, и выводить её в последовательный порт в побайтовом формате (см. прикреплённую картинку). Возможно ли вообще такое устройство? Понятно, что У1 и У2 надо как-то синхронизировать, я пока оставлю этот вопрос открытым. Мой текущий вопрос связан с аналоговой электроникой. При подключении ко входу моего "щупа", на сколько я понимаю, ток текущий в (из) EEPROM (MK У1) уменьшится, а следовательно уменьшатся всякие внутренние напряжения портов В/В (входов микросхемы). EEPROM, на сколько я понимаю, может перестать адекватно реагировать на команды записи, а МК - на команды четения. Может быть нужно будет поставить какой-нибудь транзистор для сохранения величины тока? Как в теории расчитать схему сопряжения У1 и У2 так, чтобы мониторинг шины не вредил работе самой шины? На какие параметры при этом смотреть в даташитах МК и EEPROM. Только просьба не смеяться. Если мне нужно что-то почитать для ликбеза, я с удовольствием это сделаю. Но просьба быть более конкретными и писать по теме. Советы типа "иди в школу" или "учи матчасть" мне не помогут, т.к. для первого я слишком стар, а второе слишком абстрактно и непрактично.
  14. Добрый день! Стоит задача с компьютера задавать время отсчета таймера собранного на ATmega и семисегментном индикаторе в режиме онлайн. То есть организовать связь для обмена данными с микроконтроллером ATmega. Желательно используя USB дабы не искать компьютер с COM-портом. Подскажите, какой из интерфейсов выбрать исходя из стоимости компонентов и сложности самого решения?
  15. Работа с модулем MCP2210 Breakout Module - который является полноценным конвертером USB в SPI прямо из коробки. Микросхема MCP2210 стоит на AliExpress около 2$ Статья на сайте
  16. Самодельный Spi

    Здравствуйте, уважаемые форумчане! Хочу реализовать свой "софтверный" SPI под Atmega8. Вообще, общая цель - общение с синтезатором LMX2306. Уже сломал голову от того,- как правильно отослать 21 битные регистры, используя 8-ми битные типы данных. Поэтому захотелось свой SPI с блекджеком, который может отправлять определенное количество бит переменной с выбором направления (MSB, LSB). Не пойму, как мне задать определенную частоту работы для "такого" SPI? Например, хардварный можно инициализировать на частотах osc/4, osc/16 ит.д. Как мне такое же сделать для софтверного SPI? Пишу в Atmel Studio 7
  17. Ili9341 Gram R/w Через Spi+Dma

    Мучаю всё сабж, уже работает копирование содержимого GRAM буфера. Но осталась трабла: после приёма данных с дисплея не могу производить запись. Обошёл эту проблему переинициализацией пина CS, нарисовал, затем пытаюсь заново прочитать - читаются только 0xFFFFы. Переход в режим записи осуществляется в методе установки колонки и строки, должно быть всё ок. Основная проблема - заставить дисплей переходить с режима чтения на режим записи. Опытным путём выяснилось, что запись становится невозможна сразу после передачи команды на чтение из памяти. Исходники тут: https://github.com/fagcinsk/stm-ILI9341-spi/tree/master/ILI9341_lib graph.c - LCD_readPixels - метод чтения пикселей с экрана; dma.c - методы для чтения из памяти.
  18. Необходимо запустить дисплей Nokia 5110 при помощи ATmega16, SPI сделал программный, пытаюсь инициализировать дисплей вроде все норм (Собирал схему в Proteus), а вывести не получается. Прошу помощи в данном вопросе, кто делал - поделитесь инфой
  19. Товарищи, прошу помощи , несколько недель мучаюсь с организацией совместной работы карты памяти ММС и микроконтроллера pic 16f877. излазил кучу форумов . Задача стоит такая надо разобраться в алгоритме работы с картой памяти (запись, чтение. и тд.), не надо подсовывать алгоритмы с разных сайтов если не знаете что там и где . С библиотекой Petit FatFs не совсем разобрался в файле diskio.c необходимо прописать низкоуровневую работу(пока туда не лез). Предлагаю вашему вниманию часть программы, программа компилируется и записывает только 512 байт (1 блок) , при записи нескольких блоков записывает пробелы . Проверял в Протеусе, схему не собирал. 1) вопрос как организовать запись нескольких блоков да и комарду CMD 23 (только для ММС) Распишите . #include <pic.h> #define _XTAL_FREQ 20e6 extern void SerString (const char *str); extern char SPI (char d); extern char Command (char befF,/*unsigned char AdrH,*/ unsigned char AdrL,char befH ); extern char bhf ; char df=0; void read (); void write ( char x) { if (Command(24, 0, 0xff)!=0) { SerString("Write Error"); } SerString ("writing mmc"); //while (SPI(0xFF)!=0) ; SPI (0xff); SPI (0xff); SPI (0xfe); for (int g =0; g< 512; g++){ SPI ('f'); } SPI (0xff); SPI (0xff); while ((SPI(0xff) | 0b00011111) == 0x05); while (SPI(0xff) != 0xff); //for (char i=0; i<100 ;i++); SerString("writi complit"); } void read (){ char i; if (Command(0x51,512,0xFF) !=0) SerString("Lese_resp_Fehler "); while(SPI(0xFF) != 0xFE); // Ожидание 0xFE – начала каждой передачи данных for(i=0; i < 512; i++) { while(!TXIF); // Проверка, пуст ли регистр TXREG TXREG =SPI(0xFF); // Передача байта данных } SPI(0xFF); // В конце два незначимых байта SPI(0xFF); } Забыл добавить с кодом программы уже экспериментировал много так что он может немножко корявый.
  20. Форумчане, прошу помощи. Задача следующая: наладить связь между контроллером и флеш картой в режиме SPI, при этом когда будет производится запись данных файловая система не является необходимостью. Контроллер Xmega64A3. Флеш карта SDHC 4GB. Для того, чтобы перевести флеш карту в режим инициализации, необходимо подать команду CMD0, приведенную в даташите на стандарт SD. Я отправляю эту команду, ловлю ответ (что характерно он таки есть) R1=0x20, т.е. Address error. И тут собственно вопрос: откуда эта ошибка возникает, может кто-нибудь сталкивался, знает как устранить. Сразу скажу, код не выложил потому, что даже не предполагаю, где может быть ошибка. Частота клока SPI 250кгц. Частота клока контроллера 14,7мгц. P.S. Прошу не сильно пинать, если тему сильно похожую создал или сообщение коряво написал-только осваиваю для себя форумы.
  21. Как рассчитать успеет ли микроконтроллер одновременно работать с I2С, SPI, и при этом управлять несколькими сервоприводами и бесколлекторным двигателем?
  22. Stm32 Spi

    Работаю без SPL и на данный момент с ней работать не хочу (тут, что было бы лучше писать не надо - все бессмысленно). Собрался подключить по SPI другое устройство (ENC28J60), но тут возникла незадача: SPI Работать отказывается. Во время отладки посмотрел состояние регистра SPI1_CR1, и, как оказалось, бит SPE не выставлен, как, впрочем и MSTR. Вот что выдает GDB по этому поводу (SPI1_CR1): x/2tb 0x40013000 0x40013000: 00000010 00000001 младший и старший байты регистра. Код инициализации следующий: void SetSPI (void) { // разрешаем тактирование порта A RCC->AHBENR |= RCC_AHBENR_GPIOAEN; // настраиваем пины 4, 5, 6, 7 как выходы альтернативной функции GPIOA->MODER &= ~(GPIO_MODER_MODER4 | GPIO_MODER_MODER5 | GPIO_MODER_MODER6 | GPIO_MODER_MODER7); GPIOA->MODER |= GPIO_MODER_MODER4_1 | GPIO_MODER_MODER5_1 | GPIO_MODER_MODER6_1 | GPIO_MODER_MODER7_1; // настройка скорости работы GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR4_1 | GPIO_OSPEEDER_OSPEEDR5_1 | GPIO_OSPEEDER_OSPEEDR6_1 | GPIO_OSPEEDER_OSPEEDR7_1; // настройка альтернативных функций // сначала сбрасываем, затем устанавливаем другие значения // AF0 - для всех регистров gpio - SPI1 GPIOA->AFR[0] = 0; // разрешаем тактирование SPI RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; // включаем модуль SPI1. // максимальная скорость передачи - 24МБод // делаем ведущим // полярность - отрицательная. SPI1->CR1 = SPI_CR1_CPOL | SPI_CR1_MSTR | SPI_CR1_SSI; // размер отправляемых и принимаемых данных по SPI равен 8 бит SPI1->CR2 = SPI_CR2_DS_0 | SPI_CR2_DS_1 | SPI_CR2_DS_2; // далее включаем SPI SPI1->CR1 |= SPI_CR1_SPE; } Вообще та ли последовательность инициализации, или что-то надо менять. Может где ошибка закралась?
  23. Возникла проблема с посылкой байта с помощью трансивера rfm22. Отправка происходит в цикле. После отправки возникает прерывание, на ножке PC4 висит 0. После чтения регистров 0x03 и 0x04 на ножке должна висеть 1. После отправки один раз мигает светодиод. Spi_TransmitByte(RFM22_REG_05_INTERRUPT_ENABLE_1,0xff); Spi_TransmitByte(RFM22_REG_06_INTERRUPT_ENABLE_2,0xff); while(1) { Spi_TransmitByte(RFM22_REG_0E_IO_PORT_CONFIGURATION,0x01); Spi_TransmitByte(RFM22_REG_7F_FIFO_ACCESS, 0x33); Spi_TransmitByte(RFM22_REG_07_OPERATING_AND_FUNCTION_CONTROL_1,0x09); while(PC_IDR & 0x10); byte = Spi_ReceiveByte(RFM22_REG_03_INTERRUPT_STATUS_1); byte = Spi_ReceiveByte(RFM22_REG_04_INTERRUPT_STATUS_2); for(uint16 i=0;i<500;i++) Delay_us(1000); PD_DDR |= 0x01; PD_ODR |= 0x01; for(uint16 i=0;i<500;i++) Delay_us(1000); PD_ODR &= ~0x01; } Проблема вот в чем. При отладке программы все нормально работает(Отлаживаю в IARе). При выходе из режима отладки - тоже. Но если отключить discovery от компьютера, а потом снова включить, то передатчик отправляет байт только один раз и отказывается дальше работать. Зависает в цикле while(PC_IDR & 0x10), т. е. не возникает прерывания. Может кто сталкивался с такой проблемой и может подсказать в чем дело? Мой друг настраивал передатчик используя функции spi интерфейса из стандартной библиотеки "STM8S_StdPeriph_Driver". Все нормально работает. Попробовали подключить мою - такая же проблема. Ниже код моих spi функций. void Spi_Init(void) { PC_DDR |= 0x20 | 0x40; //SCK; SDI(MOSI) PC_CR1 |= 0x20 | 0x40; PC_CR2 |= 0x20 | 0x40; PC_DDR &= ~0x80; //SDO(MISO) PG_DDR |= 0x02; //nSEL; PG_CR1 |= 0x02; PG_CR2 |= 0x02; PG_ODR |= 0x02; SPI_CR1 &= ~(MASK_SPI_CR1_BR | MASK_SPI_CR1_CPOL | MASK_SPI_CR1_CPHA); SPI_CR2 &= ~MASK_SPI_CR1_LSBFIRST; SPI_CR2 |= MASK_SPI_CR2_SSM | MASK_SPI_CR2_SSI; SPI_CR1 |= MASK_SPI_CR1_MSTR; } void Spi_TransmitByte(char address, char byte) { address |= 0x80; PG_ODR &= ~0x02; SPI_CR1 |= MASK_SPI_CR1_SPE; while(!(SPI_SR & MASK_SPI_SR_TXE)); SPI_DR = address; while(!(SPI_SR & MASK_SPI_SR_TXE)); SPI_DR = byte; while(!(SPI_SR & MASK_SPI_SR_RXNE)); address = SPI_DR; while(!(SPI_SR & MASK_SPI_SR_RXNE)); address = SPI_DR; while(!(SPI_SR & MASK_SPI_SR_TXE) && (SPI_SR & MASK_SPI_SR_BSY)); SPI_CR1 &= ~MASK_SPI_CR1_SPE; PG_ODR |= 0x02; } char Spi_ReceiveByte(char address) { char data = 0xff; PG_ODR &= ~0x02; SPI_CR1 |= MASK_SPI_CR1_SPE; while(!(SPI_SR & MASK_SPI_SR_TXE)); SPI_DR = address; while(!(SPI_SR & MASK_SPI_SR_TXE)); SPI_DR = data; while(!(SPI_SR & MASK_SPI_SR_RXNE)); data = SPI_DR; while(!(SPI_SR & MASK_SPI_SR_RXNE)); data = SPI_DR; while(!(SPI_SR & MASK_SPI_SR_TXE) && (SPI_SR & MASK_SPI_SR_BSY)); SPI_CR1 &= ~MASK_SPI_CR1_SPE; PG_ODR |= 0x02; return data; }
  24. Доброго времени суток. Обратил внимание на этот кристалл производства техасцев. Высокая линейность и низкий выходной ток подуляторов представляют разработчику большую свободу в выборе ОУ для преобразователей ток - напряжение. В отличие от 1792/94, в преобразователях которых нужно применять либо достаточно мощные ОУ, либо дополнительные интегральные или дискретные буферы для получения низких искажений. Все бы хорошо, да только конфигурирование предусмотрено только по SPI, а дефолтные настройки не те, что нужны. Немного владею микроконтроллерами фирмы Atmel (уровень чуть выше нулевого ). Решил попробовать сделать конфигуратор самостоятельно, но сразу столкнулся с некоторыми трудностями после изучения даташита 1738. Так как алгоритм работы интерфейса у 1738 несколько отличается от обычного SPI, в котором данные непрерывно "циркулируют" между мастером и слейвом. Насколько я понял, данные на выводе MDO присутствуют только после предварительной команды чтения. Мыслю следующий алгоритм работы управляющего контроллера: при записи конфигурации: при использовании аппаратного SPI шлем 2 байта (с адресом регистра и значениями). примерно такой код: SPI transfere out spdr, data (в этом байте передаем байт с номером регистра) rjmp wait spi out spdr, data2 (в этом байте передаем байт конфигурацией) rjmp wait spi ret wait spi: sbis SPSR, SPIF (ждем конца передачи) rjmp wait spi ret При чтении засылаем байт с номером регистра, в ответ получаем данные (для проверки установленных настроек). SPI read out spdr, data (в этом байте передаем байт с номером регистра) wait spi: sbis SPSR, SPIF (ждем конца передачи) rjmp wait spi in temp, SPDR (читаем ответ) ret Правильный ход мыслей?
  25. Доброго времени суток! Имеются радиомодули со SPI интерфейсом и питанием 3В, задача - приёмник должен помигать светодиодом и попищать зуммером при получении сигнала от передатчика. Насколько понял, без МК модули работать не будут, а я с ними пока не сталкивался, поэтому некоторые вопросы могут показаться глупыми, не пинайте Вот к чему привело гугление и прочтение 10 страниц данного раздела: достаточно будет PIC10F200 и простого самодельного JDM-программатора, верно? А как с прошивкой быть? Возможно, уже есть что-то похожее. Ещё: допустим, написал/нашёл программу, прошил МК, подключил к передатчику, всё работает... Как приёмник должен понять, что ему делать? Пока не совсем понимаю, что требуется и как этого добиться. Поясните, пожалуйста.