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

stm32f103 spi max7219


Рекомендуемые сообщения

Приветствую.

При подключении микрухи MAX7219 столкнулся с проблемой, что она некорректно реагирует на отсылаемые ей данные.

Я уже ознакамливался с темами этого форума касательно аналогичной проблемы, но ответа так и не было.

Сигнал с анализатора:

Спойлер

image.png

 

Сигнал согласно даташиту:

Спойлер

image.png.1c92a82ad95c7be3c06ca63a2803a51d.png

 

Код:
 

Спойлер
int main()
{
    RCC_Init(); //инициализация тактирования
 
    LED_I::init();
 
    LED_I::send_command(0x9, 0xFF); // режим декодирования
    LED_I::send_command(0xB, 0x3); // количество разрядов
    LED_I::send_command(0xA, 0x2); // яркость
    LED_I::send_command(0xC, 0x1); // включаем
 
    LED_I::send_command(0x2, 0x2); // единица
 
    while(true);
    /*{
        for(uint8_t i = 0x1; i <= 0xF; ++i)
            LED_I::send_command(0xA, i); // яркость
        LED_I::__delay(100);
    }*/
    return 0;
}
 
void LED_I::__delay(volatile uint32_t ms)
{
    uint32_t _temp = __ticks;
    while((__ticks - _temp) < ms);
}
extern "C" void SysTick_Handler()
{
    ++LED_I::__ticks;
}
void LED_I::init()
{
    //тактирование порта B уже включено таймером
    //RCC->APB2ENR = RCC_APB2ENR_IOPBEN;
    SysTick_Config(72000000 / 1000);
    RCC->APB2ENR |= RCC_APB2ENR_SPI1EN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPAEN; // запускаем тактирование SPI, PB
    
    SPI1->CR1 |= (1 << SPI_CR1_DFF_Pos)     // 16-битная передача
                | (1 << SPI_CR1_SSM_Pos)     // программный SS
                | (1 << SPI_CR1_SSI_Pos)
                | (1 << SPI_CR1_BIDIMODE_Pos)
                | (1 << SPI_CR1_BIDIOE_Pos)
                | (0 << SPI_CR1_LSBFIRST_Pos)
                | (0b111 << SPI_CR1_BR_Pos)
                | (1 << SPI_CR1_MSTR_Pos)
                | (0 << SPI_CR1_CPHA_Pos)
                | (0 << SPI_CR1_CPOL_Pos);
    SPI1->CR1 |= (1 << SPI_CR1_SPE_Pos);
    //SCK
    GPIOA->CRL |= (0b10 << GPIO_CRL_CNF5_Pos) | (0b11 << GPIO_CRL_MODE5_Pos);
  
    //CS
    GPIOB->CRH |= (0b00 <<GPIO_CRH_CNF11_Pos) | (0b11 << GPIO_CRH_MODE11_Pos);
    GPIOB->BSRR |= GPIO_BSRR_BS11;
    //MOSI
    GPIOA->CRL |= (0b10 << GPIO_CRL_CNF7_Pos) | (0b11 << GPIO_CRL_MODE7_Pos);
    while(SPI1->SR & SPI_SR_MODF);
}
 
void LED_I::send_command(const uint8_t &address, const uint8_t &command)
{
    GPIOB->BRR |= GPIO_BRR_BR11;
    //while(SPI1->SR & SPI_SR_BSY);
    
    //GPIOB->BRR |= GPIO_BRR_BR11;
 
    SPI1->DR = (address << 8) | command; // отслыем первым байтом адрес регистра, втором - команду для регистра
    //__delay(_FUNCTION_DELAY);
 
    //GPIOB->BSRR |= GPIO_BSRR_BS11;
    while (!(SPI1->SR & SPI_SR_TXE));
    //while (SPI1->SR & SPI_SR_RXNE);
    while(SPI1->SR & SPI_SR_BSY);
 
    GPIOB->BSRR |= GPIO_BSRR_BS11;
 
    __delay(1);
}

 

 

Подскажите, в чем я ошибся...
Вроде бы, все правильно.

Заранее спасибо!

 

Неправильно выразился: она вообще не реагирует на данные.
Подаю ей питание(сигнала с МК еще не было) - выводит то 4, то 3 разряда девяток.

Индикатор подключен 4-х разрядный.

Питание переподключаю - уже 3 разряда горят и т.д.

Запускаю МК, отправляю данные - никакой реакции нет.

Грешу еще на питание. с МК SPI выходит 3.3 В, а по даташиту MAX7219 высокий уровень понимает с 4+.
Питание ставил около 4 В на нее. Подавал с МК те же 3.3 В, но все равно не работает..

Но не принимаю как причину, ведь другие от СТМ32 заводят же ее как-то..

Изменено пользователем Иван Рогожников
Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, Иван Рогожников сказал:

с МК SPI выходит 3.3 В, а по даташиту MAX7219 высокий уровень понимает с 4+

Такое противоречие, и :

Цитата

Подскажите, в чем я ошибся...
Вроде бы, все правильно.

:wacko:

 

Что касается кода. Особо не вникал, но бросилось в глаза вот это :

const uint8_t &address
.....
(address << 8)

 

Ссылка на комментарий
Поделиться на другие сайты

В целом, ничего незаконного. 
Принимаю значение по константной ссылке, чтобы не копировать объект.

12 часов назад, Alex сказал:

Что касается кода. Особо не вникал, но бросилось в глаза вот это

Диаграмма на анализаторе не изменилась. Отсылаемые значения именно на анализаторе показываются верные

 

 

12 часов назад, Alex сказал:
14 часов назад, Иван Рогожников сказал:

с МК SPI выходит 3.3 В, а по даташиту MAX7219 высокий уровень понимает с 4+

Такое противоречие, и :

Цитата

Подскажите, в чем я ошибся...
Вроде бы, все правильно.

:wacko:


Хм.....Но ведь другие же запускают ее от stm-ки..

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

16 часов назад, Иван Рогожников сказал:

она вообще не реагирует на данные

И не будет. По даташиту она воспринимает высокий уровень начиная с 3,5В, вне зависимости от напряжения питания. А МК дает лишь 3,3В.

 

16 часов назад, Иван Рогожников сказал:

по даташиту MAX7219 высокий уровень понимает с 4+

image.png.7b19b9e6c62499e4f97d06912bfe1ca4.png

1 час назад, Иван Рогожников сказал:

ведь другие же запускают ее от stm-ки..

Либо поднимать питание до 3,5В (при максимуме в 3,6В занятие сомнительное), либо ставить преобразователь уровня.

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

подтверждаю. Чтобы 7219 нормально работала пришлось ставить буфер преобразователь уровней. От 3.3 нишиша не пашет

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

В 24.11.2021 в 13:40, Иван Рогожников сказал:

Принимаю значение по константной ссылке, чтобы не копировать объект.

Я не про ссылку. Хотя, и в этом есть странности - какой объект Вы не хотите копировать, 1 байт ? :D

Я говорил про ширину переменной и манипуляции с ней. Ничего не смущает ?

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • То, что Я написал, Я подразумевал, что w25qReadPage читает реальный сектор w25 длиной 4096, если это не так, то нужно состыковывать w25qReadPage и disk_read.
    • ИК-датчик не подходит его котолапые видят. Ультразвуковой слышат, он их пугает. Рентгеновский ставить не будете сами понимаете почему Остается датчик давления. Тензодатчик 5кг 4шт + HX711 + дурина = проект выходного дня. Ну а ежли извращаться : под лоток резиновую грелку или камеру от велосипеда + шланг , в нее воду, к шлангу электро-контактный манометр.   
    • Всем привет! Я новичок. Помогите пожалуйста с ремонтом телевизора Электроника 25ТЦ-313Д ( а точнее Electroniсa C433, но как я понял это почти одинаковые модели). Предыстория такая. Сам телевизор был до меня передалан в монитор для спектрумов, все лишнее для приема каналов в нем отсутсвует, только подавай сигнал RGB и синхронизацию, в дальнейшем я и планирую его так и использовать. Когда он у меня появился телевизор так себе работал, я перепаял все электролиты на новые, но особо ничего не изменилось, и он не мог поймать нормально картинку ( подавал с тюнера спутникового тв через SCART)  , на секунду устаканивалась а потом пропадала. Я попробовал поэксперементировать с блоком кадровой развертки (BKR - 10), также перепаивал там электролиты, проверял все диоды и транзисторы, потом попробовал поменять микросхемы. Поменяв микросхему КА174ХА11 на некоторое время стало лучше, картинка была не четкая не отрегулирована, но стояла на месте, и я начал крутить крутилки... Что то случилось и после моих экспериментов все заглохло. Телевизор при включении пищал, но не было накала кинескопа, и пропало изображение вообще. При этом грелся конденсатор на 1,5 кВ возле регулировки фокуса, выпаяв и проверив его оказалось что он превартился в резистор.  Пошарившись по плате еще поменял транзистор КТ815б, он превратился в диод. После этих манипуляций накал появился, и начала проявлятся слабая и тусклая картинка фона, и по середине вертикальная полоска широкая, иногда цветов радуги , иногда просто зеленая немного выделяющаяся из фона. При этом начал грется подстроечный резистор "центровка по горизонтали" (отметил его на схеме). Не знаю что дальше делать, кто что может подсказать в какую сторону двигаться, какие напряжения проверить, сам я не особо разбираюсь, и еще осциллографа нет, только тестер. Буду очень рад за помощь. Электроника_25тц-313д_схема.pdf
    • кто скачал версию (архив) BootLoader12.zip, прошу скачать его заново. в первом посте я заменил архив. к сожалению, после одного изменения функции записи флеши я допустил критическую ошибку. в результате при определенной длине прошивки маленький "хвост" прошивки не записывался. я проверял на других файлах, где не было этого "обрезания". а сейчас на одном файле столкнулся с этой ошибкой.
    • @Сергей Азиатский , вы правы. Страдать фигнёй не запретишь.
    • Я написал там код точно также как у меня написан код в обработчике USB. Это рабочий код чтения с USB размер как раз 512 байт.   В Fatfs не работает корректно, в USB работает корректно. //Чтение 512 байт в Fatfs DRESULT disk_read ( BYTE pdrv, /* Physical drive nmuber to identify the drive */ BYTE *buff, /* Data buffer to store read data */ DWORD sector, /* Sector address in LBA */ UINT count /* Number of sectors to read */ ) { DRESULT res; //res = disk.drv[pdrv]->disk_read(disk.lun[pdrv], buff, sector, count); sprintf(buffer0, "sector=%lu\r\n", sector); Usart1_Send_String(buffer0); w25qReadPage(buff, sector*2); w25qReadPage(buff + 256, sector*2+1); res=RES_OK; return res; } //Чтение 512 байт в USB: /** * @brief . * @param lun: . * @retval USBD_OK if all operations are OK else USBD_FAIL */ int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) { /* USER CODE BEGIN 6 */ LED0; // 0 включение светодиода w25qReadPage(buf, blk_addr * 2); w25qReadPage(buf + 256, blk_addr * 2 + 1); LED1; // 1 выключение светодиода return (USBD_OK); /* USER CODE END 6 */ }   Стоп, или нужно сразу 4КБ вычитывать из обработчика DRESULT disk_read()?
×
×
  • Создать...