pokk 0 May 21, 2021 Posted May 21, 2021 (edited) · Report post Записал в память(A25L032) структуру конфигурации, в 0 сектор одноразово. После написал другу программу которая только считываю конфигурацию и проверяет CRC, через 5-8 переключений питания срабатывает ошибка CRC, поймал этот момент на анализаторе вижу что поверх моих данных появились 16 единиц через 1 байт (0x0100010001000100...) и из за этого не сходиться CRC, откуда они взялись ? После переключения питания ещё раз, гребенка единиц пропадает до 5-8 переключений питания. Добавил в ПО дополнительную проверку, после того как CRC не совпала считываю ещё несколько раз структуру конфигурации (при каждом чтении на том же месте находиться гребенка единиц). После добавил считывание нулей из другого сектора (записанного заранее) между считывания конфигурации, увидел гребенку единиц при каждом чтении причем там где должен были быть нули увидел 4 гребенки через равный промежуток времени (длина структуры конфигурации около 1КБ ) Посмотрел осциллографом на левые биты, хорошие фронты явно их выдает память а не наводка. Почему память раз через раз выдает левые денные ? Edited May 21, 2021 by pokk Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 55 May 21, 2021 Posted May 21, 2021 · Report post Схема? Разводка? Подтяжки? Скорость SPI? Скорость фронтов? Протокол общения корректный? Предварительно сектор стерли? И что значит "...поверх моих данных появились 16 единиц..."? Это как? Quote Share this post Link to post Share on other sites More sharing options...
Plain 70 May 21, 2021 Posted May 21, 2021 · Report post Если предполагается баловство рубильником, схема должна быть специально сконструирована под такую забаву, а иначе, прописать в РЭ интервалы для данного органа управления, менее которых изделие не работает. Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 55 May 21, 2021 Posted May 21, 2021 · Report post Только что, Plain сказал: Если предполагается баловство рубильником... Я думаю, оно и без баловства рубильником лишь имитирует правильную работу. Quote Share this post Link to post Share on other sites More sharing options...
pokk 0 May 21, 2021 Posted May 21, 2021 (edited) · Report post 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 Edited May 21, 2021 by pokk Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 55 May 21, 2021 Posted May 21, 2021 · Report post Цитата 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С правильно), но в некоторых местах... Это Вы анализатором смотрите? Quote Share this post Link to post Share on other sites More sharing options...
pokk 0 May 21, 2021 Posted May 21, 2021 (edited) · Report post 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 считываются данные правильно без этих единиц (тоже смотрю через анализатор) на том же ПО Edited May 21, 2021 by pokk Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 55 May 21, 2021 Posted May 21, 2021 · Report post Другой сектор попробуйте стереть. И потом читать его. А еще попробуйте уменьшить силу фронтов на CS/MOSI/CLK. Quote Share this post Link to post Share on other sites More sharing options...
pokk 0 May 21, 2021 Posted May 21, 2021 (edited) · Report post 10 minutes ago, Arlleex said: Другой сектор попробуйте стереть. И потом читать его. Пробовал тоже самое. Судя по тому после сбоя считываются единицы из сектора заполненного нулями сдается, что это будет происходит при считывании из любого другого сектора. В ПО присутствует бутлоадер, но по ВКЛ питанию он только CRC прошивки проверяет и переходит на неё. Edited May 21, 2021 by pokk Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 55 May 21, 2021 Posted May 21, 2021 · Report post Забавно. Я бы другой чип попробовал, если уверенность в правильности общения по SPI есть... CPOL/CPHA правильно настроены? Quote Share this post Link to post Share on other sites More sharing options...
TOG 0 May 24, 2021 Posted May 24, 2021 · Report post Может я ошибаюсь, но мне кажется, что дело в этом: l Думаю если Вы переключите настройки анализатора протокола на Faling Edge, то эти эфемерные единички при считывании данных пропадут. Quote Share this post Link to post Share on other sites More sharing options...