pokk 0 21 мая, 2021 Опубликовано 21 мая, 2021 (изменено) · Жалоба Записал в память(A25L032) структуру конфигурации, в 0 сектор одноразово. После написал другу программу которая только считываю конфигурацию и проверяет CRC, через 5-8 переключений питания срабатывает ошибка CRC, поймал этот момент на анализаторе вижу что поверх моих данных появились 16 единиц через 1 байт (0x0100010001000100...) и из за этого не сходиться CRC, откуда они взялись ? После переключения питания ещё раз, гребенка единиц пропадает до 5-8 переключений питания. Добавил в ПО дополнительную проверку, после того как CRC не совпала считываю ещё несколько раз структуру конфигурации (при каждом чтении на том же месте находиться гребенка единиц). После добавил считывание нулей из другого сектора (записанного заранее) между считывания конфигурации, увидел гребенку единиц при каждом чтении причем там где должен были быть нули увидел 4 гребенки через равный промежуток времени (длина структуры конфигурации около 1КБ ) Посмотрел осциллографом на левые биты, хорошие фронты явно их выдает память а не наводка. Почему память раз через раз выдает левые денные ? Изменено 21 мая, 2021 пользователем pokk Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 21 мая, 2021 Опубликовано 21 мая, 2021 · Жалоба Схема? Разводка? Подтяжки? Скорость SPI? Скорость фронтов? Протокол общения корректный? Предварительно сектор стерли? И что значит "...поверх моих данных появились 16 единиц..."? Это как? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 219 21 мая, 2021 Опубликовано 21 мая, 2021 · Жалоба Если предполагается баловство рубильником, схема должна быть специально сконструирована под такую забаву, а иначе, прописать в РЭ интервалы для данного органа управления, менее которых изделие не работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 21 мая, 2021 Опубликовано 21 мая, 2021 · Жалоба Только что, Plain сказал: Если предполагается баловство рубильником... Я думаю, оно и без баловства рубильником лишь имитирует правильную работу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pokk 0 21 мая, 2021 Опубликовано 21 мая, 2021 (изменено) · Жалоба 57 minutes ago, Arlleex said: Схема? Разводка? Подтяжки? Схема стандартная CS(програмный) MISO MOSI CLK к процессору, разводка вдалеке от всяких реле и тд (реле уже отключил что бы не мешало). CS подтянут через 4.7кОм на +3.3в MISO MOSI CLK через 1.3 кОм на землю. 57 minutes ago, Arlleex said: Скорость SPI? Скорость фронтов? Скорость 2МГц вместо 60-100, так что с фронтами все с запасом по даташиту наносекунду у меня микросекунды 57 minutes ago, Arlleex said: Протокол общения корректный? Предварительно сектор стерли? Да сектор стирал, иначе бы при каждом запуске CRC не сходилось бы. Протокол корректный, несколько дней работало потом начала конфигурация слетать, назначил разбираться..,все убрал из прошивки осталось 1 задача (FreeRtos ) для работы с памятью и то уже на основных функциях. В принципе даже одной функцией пользуюсь. //================================================================================================== /* * @Описание: Описание функции. * @Параметр: * @Возврат: Нету */ void A25L0xx_ReadBytes(uint32_t ReadAddr,uint8_t* pBuffer, uint32_t NumByteToRead){ if(NumByteToRead==0){return;} xSemaphoreTakeRecursive(MutexA25L0xx,portMAX_DELAY); TakeMutexSpi(); FLASH_CS_OFF(); //------------------------------------------------------------------------------- TempTransmitBuff[0]=0x03; TempTransmitBuff[1]=((ReadAddr & 0xFF0000) >> 16); TempTransmitBuff[2]=((ReadAddr & 0xFF00) >> 8); TempTransmitBuff[3]=(ReadAddr & 0xFF); //------------------------------------------------------------------------------- Send_Spi_dma(0,TempTransmitBuff,4,TYPE_TRANSMIT,USE_MINC); //------------------------------------------------------------------------------- Send_Spi_dma(pBuffer,&DUMMY,NumByteToRead,TYPE_RECEIVE,TRANSMIT_NOT_MINC); // Без инкримента данных на передачу //------------------------------------------------------------------------------- FLASH_CS_ON(); GiveMutexSpi(); xSemaphoreGiveRecursive(MutexA25L0xx); } Перед чтением ставил задержу в 2с на установку памяти не помогло. 57 minutes ago, Arlleex said: И что значит "...поверх моих данных появились 16 единиц..."? Это как? Вижу что из памяти считываются мои данные(id совпадает и в конце CRС правильно), но в некоторых местах там где должны быть нули появилась гребенка единиц, думаю и других местах тоже есть, просто пока их ещё не заметил. Под отладчиком все корректно работает. На втором канале строб на тех местах где появляются левые биты. Вот целиком вся задача (SysLogWrite отключены, ReadConfingFromMem это A25L0xx_ReadBytes + CRC ) Spoiler //================================================================================================== /* * @Описание: Описание функции. * @Параметр: * @Возврат: Нету */ void vTaskConfing (void *pvParameters) { int8_t res; //-------------------------------------------------------------------------------------------- Init_CRC(); Init_rng(); //-------------------------------------------------------------------------------------------- InitMem(FILE_CONFING,0,2); // //-------------------------------------------------------------------------------------------- vTaskDelay( 200 / portTICK_RATE_MS ); res=ReadConfingFromMem(READ_NEW_BLOCK); //1 чтение if(res==NOT_BLOCK){ SysLogWrite(SYS_LOG_TASK_CONFING,"TaskConfing !!NOT_BLOCK!!"); } if(res==ERROR_CRC){ SysLogWrite(SYS_LOG_TASK_CONFING,"TaskConfing !!ERROR_CRC!!"); SysLogWriteParam(SYS_LOG_TASK_CONFING,"TaskConfing CRC= ",confing.mcrc); InitPwm(TIM11,6720); if(confing.ConfigSignature==0xAABBCCDD){ TIM11->CCR1=3000; SysLogWriteParam(SYS_LOG_TASK_CONFING,"TaskConfing ConfigSignature=OK ",confing.ConfigSignature); }else{ SysLogWriteParam(SYS_LOG_TASK_CONFING,"TaskConfing ConfigSignature=ERR ",confing.ConfigSignature); TIM11->CCR1=1000; //Почти без шумно } vTaskDelay( 100 / portTICK_RATE_MS ); A25L0xx_ReadBytes(TEST_SECTOR*4096,(uint8_t*)&confing,sizeof(confing_t)); //2 чтение vTaskDelay( 100 / portTICK_RATE_MS ); A25L0xx_ReadBytes(235*4096,(uint8_t*)&confing,sizeof(confing_t)); //3 чтение (должны быть нули сектор ранее был записон нулями) vTaskDelay( 100 / portTICK_RATE_MS ); A25L0xx_ReadBytes(TEST_SECTOR*4096,(uint8_t*)&confing,sizeof(confing_t)); //4 чтение } if(res==READ_OK){ SysLogWrite(SYS_LOG_TASK_CONFING,"TaskConfing READ_OK"); Debug1_0 } //-------------------------------------------------------------------------------------------- FillSoftware(); //-------------------------------------------------------------------------------------------- xEventGroupSetBits(xCreatedEventGroup,WAIT_EVENT_INIT_MEMORY); //-------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------- while(1){ xSemaphoreTake(xSemPing,portMAX_DELAY); } vTaskDelete(NULL); } ErrorMem.kvdat Изменено 21 мая, 2021 пользователем pokk Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 21 мая, 2021 Опубликовано 21 мая, 2021 · Жалоба Цитата Send_Spi_dma(0,TempTransmitBuff,4,TYPE_TRANSMIT,USE_MINC); Send_Spi_dma(pBuffer,&DUMMY,NumByteToRead,TYPE_RECEIVE,TRANSMIT_NOT_MINC); У Вас там что, программная очередь транзакций реализована? Иначе тут своего рода гонка. ErrorMem.kvdat - это еще кто такой? Софта, знающего такое разрешение, я не имею. Выкладывайте в общедоступном формате - хоть картинками, хоть в .pdf. Цитата Вижу что из памяти считываются мои данные(id совпадает и в конце CRС правильно), но в некоторых местах... Это Вы анализатором смотрите? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pokk 0 21 мая, 2021 Опубликовано 21 мая, 2021 (изменено) · Жалоба 29 minutes ago, Arlleex said: У Вас там что, программная очередь транзакций реализована? Иначе тут своего рода гонка. Просто жду завершение передачи. Spoiler //================================================================================================== /* * @Описание: Описание функции. 1) Для передачи данных нам нужна передача (С MINC) и прием (БЕЗ MICN) 2) Для приемма данных нам нужна передача (БЕЗ MINC) И прием с (MINC) * @Параметр: * @Возврат: Нету */ void Send_Spi_dma(uint8_t* Receive, uint8_t *buff,uint16_t len,uint8_t type,uint8_t minc){ //--------------------------------------------------- xWaitSpiCompleated = xTaskGetCurrentTaskHandle(); //--------------------------------------------------- DMA1_Stream4->CR&=~ DMA_SxCR_EN; // Вкл. передачу DMA1_Stream3->CR&=~ DMA_SxCR_EN; // Вкл. прием //--------------------------------------------------- DMA1_Stream4->CR&=~ DMA_SxCR_CHSEL; // 000: channel 0 selected DMA1_Stream3->CR&=~ DMA_SxCR_CHSEL; // 000: channel 0 selected //---------------------------------------------- //-----------Настройки Прием/передача----------- //---------------------------------------------- //---------------------------------------------- //---------------------------------------------- //---------------------------------------------- if(minc==TRANSMIT_NOT_MINC){ DMA1_Stream4->CR&=~ DMA_SxCR_MINC; // TX }else if(minc==RECEIVE_NOT_MINC){ DMA1_Stream3->CR&=~ DMA_SxCR_MINC; // RX } //---------------------------------------------- if(type==TYPE_TRANSMIT){ DMA1_Stream3->CR&=~ DMA_SxCR_MINC; // RX if(minc==USE_MINC){ DMA1_Stream4->CR|= DMA_SxCR_MINC; // TX } }else{ //-------------Прием (RX)---------------------------- DMA1_Stream3->PAR= (uint32_t)&SPI2->DR; DMA1_Stream3->M0AR=(uint32_t)Receive; // Массив DMA1_Stream3->NDTR=len; // Длина буфера //--------------------------------------------------- (void)SPI2->DR; DMA1_Stream3->CR|= DMA_SxCR_MINC; // RX if(minc==USE_MINC){ DMA1_Stream4->CR|= DMA_SxCR_MINC; // TX } } //---------------------------------------------- //-------------передача TX---------------------- //---------------------------------------------- //---------------------------------------------- DMA1_Stream4->PAR= (uint32_t)&SPI2->DR; // DMA1_Stream4->M0AR=(uint32_t)buff; // Массив DMA1_Stream4->NDTR=len; // Длина буфера //---------------------------------------------- if(type==TYPE_TRANSMIT){ DMA1_Stream4->CR|= DMA_SxCR_EN; // Вкл. передачу }else{ DMA1_Stream3->CR|= DMA_SxCR_EN; // Вкл. прием DMA1_Stream4->CR|= DMA_SxCR_EN; // Вкл. передачу } //--------------------------------------------------- if(Receive!=0){ //vTaskDelay( 2 / portTICK_RATE_MS ); delay_ms(2); delay_us(550); Debug1_1 delay_us(150); Debug1_0 } //--------------------------------------------------- ulTaskNotifyTake(pdTRUE,portMAX_DELAY); } //================================================================================================== /* * @Описание: Описание функции. * @Параметр: * @Возврат: Нету */ void DMA1_Stream4_IRQHandler(void){ BaseType_t xHigherPriorityTaskWoken = pdFALSE; if(DMA1->HISR & DMA_HISR_TCIF4) { while (SPI2->SR & SPI_SR_BSY); vTaskNotifyGiveFromISR(xWaitSpiCompleated,&xHigherPriorityTaskWoken); // запускаем процесс опроса slave taskYIELD(); } DMA1->HIFCR = DMA_HIFCR_CTCIF4|DMA_HIFCR_CHTIF4|DMA_HIFCR_CTEIF4|DMA_HIFCR_CDMEIF4|DMA_HIFCR_CFEIF4; } Это для установки строба //--------------------------------------------------- if(Receive!=0){ //vTaskDelay( 2 / portTICK_RATE_MS ); delay_ms(2); delay_us(550); Debug1_1 delay_us(150); Debug1_0 } Кстати при vTaskDelay( 2 / portTICK_RATE_MS ); гребенка битов сдвигается на другое место. 29 minutes ago, Arlleex said: Это Вы анализатором смотрите? Да так же и гребенку битов там вижу. 29 minutes ago, Arlleex said: ErrorMem.kvdat - это еще кто такой? Это от анализатора файл данных Kingst VIS Вот начало посылки Вот конец поссылки + гребенка единиц Эта целиком пакет считанный из сектора в который ранее записал все нули. Не как не могу понять как ПО только на чтение может ломать данные которые считываются из памяти. Раз 8-10 считываются данные правильно без этих единиц (тоже смотрю через анализатор) на том же ПО Изменено 21 мая, 2021 пользователем pokk Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 21 мая, 2021 Опубликовано 21 мая, 2021 · Жалоба Другой сектор попробуйте стереть. И потом читать его. А еще попробуйте уменьшить силу фронтов на CS/MOSI/CLK. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pokk 0 21 мая, 2021 Опубликовано 21 мая, 2021 (изменено) · Жалоба 10 minutes ago, Arlleex said: Другой сектор попробуйте стереть. И потом читать его. Пробовал тоже самое. Судя по тому после сбоя считываются единицы из сектора заполненного нулями сдается, что это будет происходит при считывании из любого другого сектора. В ПО присутствует бутлоадер, но по ВКЛ питанию он только CRC прошивки проверяет и переходит на неё. Изменено 21 мая, 2021 пользователем pokk Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 21 мая, 2021 Опубликовано 21 мая, 2021 · Жалоба Забавно. Я бы другой чип попробовал, если уверенность в правильности общения по SPI есть... CPOL/CPHA правильно настроены? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TOG 0 24 мая, 2021 Опубликовано 24 мая, 2021 · Жалоба Может я ошибаюсь, но мне кажется, что дело в этом: l Думаю если Вы переключите настройки анализатора протокола на Faling Edge, то эти эфемерные единички при считывании данных пропадут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться