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

artos5

Moderators
  • Постов

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

  • Посещение

  • Победитель дней

    7

Весь контент artos5

  1. Подскажи пожалуйста как правильно инициировать монтирование диска, и вообще помоги пожалуйста куском кода, который будет открывать файл. Этот пример я взял в интернете.
  2. А что там анализировать? 1) Монтируется успешно. 2) Запрашивается в функции чтения данные с сектором 0, и перед каждым не успешно найденным файлом. 3) если выкинуть отладку, то один файл находит, но чтение буфера 0 и сам буфер пустой. Где-то косяк с конфигами... Кто работал пожалуйста подскажите, чтобы меньше потратить времени... Можно конечно. Какая разница как название указывать? Через массив символов либо явно указав массив символов в виде строки.
  3. Это тот самый проект, просто следующий этап задачи - реализовать чтение уже записанных файлов на стороне МК.
  4. Добрый вечер всем! Проблема следующая: Есть флешка с записанной файловой системой через USB MASS STORAGE DEVICES. При "втыкании" в порт USB открывается на ПК диск с содержимым. Я подключил библиотеку Fatfs и прописал низкоуровневые функции чтения и записи в файле diskio.c Работаю с файлом так: disk_initialize(SDFatFs.drv); if(f_mount(&SDFatFs,(TCHAR const*)USER_Path,0)!=FR_OK) { //Error_Handler(); Usart1_Send_String("Error_f_mount!\r\n"); } else { if(f_open(&MyFile,"01.WAV",FA_READ)!=FR_OK) { //Error_Handler(); Usart1_Send_String("Error_open_File1!\r\n"); } else { Usart1_Send_String("open_File_OK1!\r\n"); } if(f_open(&MyFile,"01.wav",FA_READ)!=FR_OK) { //Error_Handler(); Usart1_Send_String("Error_open_File2!\r\n"); } else { Usart1_Send_String("open_File_OK2!\r\n"); UINT testBytes=0; f_read(&MyFile, buff1, 512, &testBytes); sprintf(buf1, "TestBytes=%d\r\n", testBytes); Usart1_Send_String(buf1); Usart1_Send_hex((char*)buff1, 512); Usart1_Send_String("read_File_complite!\r\n"); f_close(&MyFile); } } подправил diskio.c так: 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+256); res=RES_OK; return res; } #if _USE_WRITE == 1 DRESULT disk_write ( BYTE pdrv, /* Physical drive nmuber to identify the drive */ const BYTE *buff, /* Data to be written */ DWORD sector, /* Sector address in LBA */ UINT count /* Number of sectors to write */ ) { DRESULT res; //res = disk.drv[pdrv]->disk_write(disk.lun[pdrv], buff, sector, count); w25qWritingByUSB(sector, (uint8_t*)buff); res=RES_OK; return res; } #endif /* _USE_WRITE == 1 */ функцию чтения на самом деле пробовал прописывать по разному, все равно не корректно работает... Выдает в отладке такое: Program start!.... sector=0 // это обращение к функции чтения DRESULT disk_read (); Error_open_File1! sector=0 // это обращение к функции чтения DRESULT disk_read (); Error_open_File2! Что я забыл еще добавить?
  5. Я в ходе отладки выяснил, что сбоит в функции: void w25qWritingByUSB(uint32_t dpagenum, uint8_t *bufByUSB) При чем поведение очень странное. Отладочные сообщения даже не выводятся в начале функции. В ходе экспериментов понял что связано это с объявлением массивов и решил объявить большие буферы которые на 4КБ и 0.25КБ: uint8_t current_sector_buf[4096]; uint8_t buf[256]; глобально. В оригинале, буферы объявлялись локально в функции. После изменения буквально двух строчек кода, все заработало. Также, в оригинальном проекте было сильно напутано из функциями. Я решил функции выкинуть из main.c и вставить в w25q.c Эти функции: void w25qEraseSector(uint16_t sector) void w25qWritingByUSB(uint32_t dpagenum, uint8_t *bufByUSB) Поиск данной проблемы реально отобрало кучу времени. На будущее буду знать что и такое бывает...
  6. Получается 64 блока в которых 16 секторов и 4096 байт в секторе. Итого секторов: 1024 для W25Q32. Осталось разобраться какой диапазон значений у "void w25qWritingByUSB(uint16_t dpagenum, uint8_t *bufByUSB)" А именно у dpagenum. Подскажите пожалуйста кто знает... Это сильно сократит время.
  7. Сейчас разбираюсь с адресами, что-то у автора похоже напутано с адресами.... Какой диапазон значений у dpagenum для флешки 4МБ. такой ( 4МБ / 1024 )?: void w25qWritingByUSB(uint16_t dpagenum, uint8_t *bufByUSB) и какой диапазон значений у sector?: _w25qEraseSector(uint32_t sector) загнал этот код в Visual studio и получаю такое: при значении от 0 до 7 в _w25qEraseSector(uint32_t sector) попадает 0 при значении от 8 до 15 в _w25qEraseSector(uint32_t sector) попадает 1 при значении от 16 до 23 в _w25qEraseSector(uint32_t sector) попадает 2 и т.д. Код Visual studio:
  8. Добрый день! В просторах интернета нашел проект: https://github.com/pav2000/USB_W25Q32 А также темы , в которых у людей тоже возникали проблемы: https://electronics.stackexchange.com/questions/494692/stm32f103c8-w25q64-usb-mass-storage-device http://forum.easyelectronics.ru/viewtopic.php?f=35&t=42411 Я скачал проект, пересобрал под микроконтроллер STM32F103C8, и прошил. В результате не работает. Даже на этапе форматирования возникает сбой. У кого есть рабочий проект для такого МК и флешки? Либо кто может помочь? Может быть проблема в размере блока 1024 байта? Система не хочет ставить размер блока меньше чем 1024, а в проекте размер блока 512.... /*---------- -----------*/ #define USBD_MAX_NUM_INTERFACES 1 /*---------- -----------*/ #define USBD_MAX_NUM_CONFIGURATION 1 /*---------- -----------*/ #define USBD_MAX_STR_DESC_SIZ 512 /*---------- -----------*/ #define USBD_DEBUG_LEVEL 0 /*---------- -----------*/ #define USBD_SELF_POWERED 1 /*---------- -----------*/ #define MSC_MEDIA_PACKET 512 void w25qWritingByUSB(uint16_t dpagenum, uint8_t *bufByUSB) { uint8_t current_sector_buf[4096]; uint16_t current_sector_addr = dpagenum / 8; uint16_t startPage = current_sector_addr * 16; int offset = 512 * (dpagenum % 8); for (uint16_t i = 0; i < 16; i++) { w25qReadPage(current_sector_buf + 256 * i, startPage + i); } memcpy(current_sector_buf + offset, bufByUSB, 512); w25qEraseSector(current_sector_addr); startPage = current_sector_addr * 16; for (uint16_t i = 0; i < 16; i++) { uint8_t buf[256]; memcpy(buf, current_sector_buf + i * 256, 256); w25qWritePage(buf, startPage + i); } } void _w25qEraseSector(uint32_t sector) { w25qSetBlockProtect(0x00); sector = (sector << 4); // Отличие uint8_t com = W25Q_WRITE_ENABLE; uint8_t temp[4] = { W25Q_SECTOR_ERASE_4, (uint8_t) (sector >> 8), (uint8_t) (sector & 0x00FF), 0x00 }; W25Q_CS_LO(); //HAL_SPI_Transmit(W25Q_SPI, &com, 1, 10); SPI_Send(com); W25Q_CS_HI(); W25Q_CS_LO(); //HAL_SPI_Transmit(W25Q_SPI, temp, 4, 10); for(uint8_t x=0; x<4; x++) SPI_Send(temp[x]); W25Q_CS_HI(); w25qWaitForReady(); temp[0] = W25Q_WRRITE_DISABLE; W25Q_CS_LO(); //HAL_SPI_Transmit(W25Q_SPI, temp, 1, 10); SPI_Send(temp[0]); W25Q_CS_HI(); w25qSetBlockProtect(0x0F); } И еще, как переделать под размер блока 1024? Кроме дефайнов что еще поправить? Потому как проблема также есть, но статусный светодиод иначе ведет себя.
  9. Добрый вечер уважаемые! У STM32F407VET6 две области оперативной памяти. IRAM1 и IRAM2. У меня в коде при объявлении буфера в функции (Проект взят из интернета) #define ILI9341_PIXEL 76800 void LCD_ILI9341_DisplayImage(uint16_t image[ILI9341_PIXEL]) Вываливается ошибка что не хватает памяти... Но памяти то в принципе хватает, просто она разделена на две части... Как решить эту проблему? При изменении IRAM1 = 0x30000 - проект собирается. Когда стоит значение штатное IRAM1 = 0х20000 - памяти не хватает. И почему вообще так много памяти код занимает? Я то еще ничего особо и не добавил в код.
  10. Я смотрел просто esp32. Посмотрел вчера esp32-s2, да, есть там USB. Но учитывая сюрпризы в ESP8266 которые встречались, то связываться с ESP32 не сильно хочется
  11. Не нашел я в даташите упоминание про наличие USB...
  12. Есть проблема с есп32. Мне нужен USB и I2S . Посмотрел на есп32 даташит - USB у него вообще по ходу нет?
  13. artos5

    Stm32f401ccu i2s мастерклок

    Добрый день уважаемые! Вопрос по данному микроконтроллеру и I2S 3. У этого МК нет I2S_MCK но есть I2S_CK . Чем отличается второй от первого? Хочу на этом МК сделать USB I2S простой транспорт. Стоит ли на этом МК строить подобное? Или лучше взять например STM32F411?
  14. написал простенький код, и проверил. То вроде работает . Чуть позже буду в железе проверять (на силовой). Код для 1Ф инвертора с чистым синусом. Поэтому тут только две пары выходов задействованы. uint16_t arr_pwm[42]={952 ,1094 ,1233 ,1365 ,1488 ,1600 ,1696 ,1776 ,1838 ,1880 , 1901 ,1901 ,1880 ,1838 ,1776 ,1696 ,1600 ,1488 ,1365 ,1233 , 1094 ,952 ,810 ,671 ,539 ,416 ,304 ,208 ,128 ,66 , 24 ,3 ,3 ,24 ,66 ,128 ,208 ,304 ,416 ,539 ,671 ,810}; //Счетчик значения фаз, А В С. //uint8_t count_A=0; //uint8_t count_B=14; //uint8_t count_C=28; uint8_t count_A=0; uint8_t count_B=21, flg=0; void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim3) { TIM1->CCR1 = arr_pwm[count_A]; TIM1->CCR2 = arr_pwm[count_B]; count_A++; count_B++; if( count_A==42){ count_A=0;} if( count_B==42){ count_B=0; if(flg)// тест частоты { OUT1_OFF; flg=0; } else { OUT1; flg=1; } } }
  15. Это я знаю . Таблица синуса засовывается в фазу А например , потом сдвигаем таблицу на 1/3 длины и засовываем в фазу В , потом снова сдвигаем на 1/3 и засовываем в С. Меня тут интересует как форма сигнала выглядит на 6 выходах при этом? Так как я показал на одной фазе? Или не так?
  16. ПЧ например. Так же вроде должно формироваться? Сначала на верхнем ключе ШИМ генерится , на нижнем тишина , потом вторая полуволна генерится на нижнем ключе?
  17. А как получить такой график? За счёт dead time?
  18. Поясните пожалуйста как происходит аппаратно генерация ШИМ на всех 6 ножках МК (в случае применения 3-х фазного ШИМ для управления мотора) ? Коммутация верхний/нижний ключ для подачи на эту ножку ШИМ выполняется все таки в ручную или аппаратно? Судя из RM на STM32F401 это делается в регистре TIMx>CCER Попробовал я сегодня комплементарный ШИМ выводить генерит на верхнем к примеру 70% заполнение а на нижнем 29.9% . Тут все понятно . Но как в случае генерации синуса для мотора ? Нужно переключать в ручную регистр TIMx_CCER? Судя из примеров , переключение этого регистра не выполняется.... Что-то я вообще запутался .
  19. Полный код запроса версии бутлоадера и вывод его в терминал: GPIOA->BSRR=GPIO_BSRR_BR3; //reset; while(!(SPI1->SR & SPI_SR_TXE)); SPI1->DR=(uint8_t)0xFF; while(!(SPI1->SR & SPI_SR_TXE)); SPI1->DR=(uint8_t)0xFF; while(!(SPI1->SR & SPI_SR_TXE)); SPI1->DR=(uint8_t)0xFF; delay_ms(200); GPIOA->BSRR=GPIO_BSRR_BS3; //reset; delay_ms(200); TIM1_Init(); rx[8]=0; while ((GPIOA->IDR & GPIO_IDR_IDR10)); //busy while(!(SPI1->SR & SPI_SR_TXE)); SPI1->DR=(uint8_t)0xFB; while ((GPIOA->IDR & GPIO_IDR_IDR10)); //busy delay_ms(1); for(i=0; i<8; i++) { while ((GPIOA->IDR & GPIO_IDR_IDR10)); //busy while(!(SPI1->SR & SPI_SR_TXE)); SPI1->DR=(uint8_t)0xFF; while(!(SPI1->SR & SPI_SR_RXNE)); rx[i]=SPI1->DR; delay_ms(1); } USART1_Send_String("CHIP ID HEX FORMAT: "); for(i=0; i<8; i++) { char buff[32]; sprintf(buff, "%02Xh ", rx[i]); USART1_Send_String(buff); } USART1_Send_String("\r\n"); char buff[48]; sprintf(buff, "CHIP ID ISCII: %s\r\n", rx); USART1_Send_String(buff); Код инициализации SPI: void Configure_SPI1(void) { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; GPIOA->CRL &= ~(GPIO_CRL_CNF4); // CS GPIOA->CRL |= GPIO_CRL_MODE4_1; RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; GPIOA->CRL |=(GPIO_CRL_MODE5|GPIO_CRL_MODE6|GPIO_CRL_MODE7); // CLOCK, MISO, MOSI GPIOA->CRL &= ~(GPIO_CRL_CNF5|GPIO_CRL_CNF5|GPIO_CRL_CNF7); GPIOA->CRL |=(GPIO_CRL_CNF5_1|GPIO_CRL_CNF6_1|GPIO_CRL_CNF7_1); RCC->APB2ENR|=RCC_APB2ENR_SPI1EN ; SPI1->CR1|=SPI_CR1_MSTR|SPI_CR1_BR|SPI_CR1_SSM|SPI_CR1_SSI|SPI_CR1_BR; SPI1->CR1|=SPI_CR1_LSBFIRST|SPI_CR1_CPHA|SPI_CR1_CPOL; SPI1->CR2|=SPI_CR2_SSOE; SPI1->CR1|=SPI_CR1_SPE; }
  20. Переделал под счет лог.1 линии BUSY. Результат тоже не тот что надо. Есть большое подозрение что я не правильно SPI настроил... В SPI отправляю: uint8_t data[12]={0xF5,0xDF,0xFF,0xFF,0x07,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; //M32C А в логах анализатора получаю: Почему 5-й байт не 0х07? да и первые байты не соответсвуют... на скрине кстати неправильно подписан MISO и MOSI . Их нужно воспринимать наоборот . И проц Renesas отвечает постоянно 0xD4 Скрины запроса ай-ди: Запрос ай-ди, команда 0xFB: В ответ всегда 0xD4: И почему то отправляю одно. А в логере другое.
  21. Завтра подправлю код , чтобы анализировать именно лог 1 сигнала BUSY. Спасибо что уделили внимание моей теме! О результатах отпишусь!
  22. Так вот 0 сигнал и нужно отслеживать. Посмотрите скриншот в статье , какой сигнал отличается при совпадении KEY. Вот:
  23. Добрый день уважаемые! Кто пробовал вычислять ключ в запароленном МК семейства renesas M32C ? Они исправили уже эту проблему? Или я просто что то неправильно делаю? for (i=0;i<12;i++) { while ((GPIOA->IDR & GPIO_IDR_IDR10)){}; //busy if (i==11) { while(!(SPI1->SR & SPI_SR_TXE)); TIM1->CNT=0; TIM1->CR1 |= TIM_CR1_CEN; // включение счета Counter Enable SPI1->DR=(uint8_t)data[i]; while (!(GPIOA->IDR & GPIO_IDR_IDR10)){}; //busy revers times[count]=TIM1->CNT; } else { while ((GPIOA->IDR & GPIO_IDR_IDR10)){}; //busy revers while(!(SPI1->SR & SPI_SR_TXE)); SPI1->DR=(uint8_t)data[i]; while (!(GPIOA->IDR & GPIO_IDR_IDR10)){}; //busy revers } } Микроконтроллер для определения длительности импульса BUSY выбрал STM32F103C8T6. Получил такие логи. Получается странная версия загрузчика в ответе и одинаковая длина импульса BUSY: Кто работал с такими МК? Что я не так делаю? Статья взятая за основу по ренесас:
×
×
  • Создать...