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

A25L032+STM32F407 Периодическое чтение гребенки единиц

Записал в память(A25L032) структуру конфигурации, в 0 сектор одноразово.
После написал другу программу которая только считываю конфигурацию и проверяет CRC, через  5-8 переключений питания срабатывает ошибка CRC, поймал этот момент на анализаторе вижу что поверх моих данных появились 16 единиц через 1 байт (0x0100010001000100...)  и из за этого не сходиться CRC, откуда они взялись ?
После переключения питания ещё раз, гребенка единиц пропадает до 5-8 переключений питания.
Добавил в ПО дополнительную проверку, после того как CRC не совпала считываю ещё несколько раз структуру конфигурации (при каждом чтении на том же месте находиться гребенка единиц).
После добавил считывание нулей из другого сектора (записанного заранее)  между считывания конфигурации,   увидел гребенку единиц при каждом чтении причем там где должен были быть нули увидел 4 гребенки через равный промежуток времени (длина структуры конфигурации около 1КБ )
Посмотрел осциллографом на левые биты, хорошие фронты явно их выдает память а не наводка.

Почему память раз через раз выдает левые денные ?

Изменено пользователем pokk

Поделиться сообщением


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

Схема? Разводка? Подтяжки?
Скорость SPI? Скорость фронтов?
Протокол общения корректный? Предварительно сектор стерли?
И что значит "...поверх моих данных появились 16 единиц..."? Это как?

Поделиться сообщением


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

Если предполагается баловство рубильником, схема должна быть специально сконструирована под такую забаву, а иначе, прописать в РЭ интервалы для данного органа управления, менее которых изделие не работает.

Поделиться сообщением


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

Только что, Plain сказал:

Если предполагается баловство рубильником...

Я думаю, оно и без баловства рубильником лишь имитирует правильную работу.

Поделиться сообщением


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

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

Изменено пользователем pokk

Поделиться сообщением


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

Цитата

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С правильно), но в некоторых местах...

Это Вы анализатором смотрите?

Поделиться сообщением


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

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

 

Вот начало посылки

1157576774_.thumb.png.981d147d4f8c8ffbdb8d550bf4c53b3f.png

 

Вот конец поссылки + гребенка единиц

1073385351_.thumb.png.a68ef753126c982147cf326453bd7f6b.png

 

Эта целиком пакет считанный из сектора в который ранее записал все нули.

1228426823_.thumb.png.646d1aa89ec80b45f021c250190195ff.png

 

 

Не как не могу понять как ПО только на чтение может ломать данные которые считываются из памяти.

Раз  8-10 считываются данные правильно без этих единиц (тоже смотрю через анализатор) на том же ПО

 

 

 

 

Изменено пользователем pokk

Поделиться сообщением


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

Другой сектор попробуйте стереть. И потом читать его. А еще попробуйте уменьшить силу фронтов на CS/MOSI/CLK.

Поделиться сообщением


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

10 minutes ago, Arlleex said:

Другой сектор попробуйте стереть. И потом читать его.

Пробовал тоже самое.
Судя по тому после сбоя считываются единицы из сектора заполненного нулями сдается, что это будет происходит при считывании из любого другого сектора.

 

В ПО присутствует бутлоадер, но по ВКЛ питанию он только CRC прошивки проверяет и переходит на неё. 

Изменено пользователем pokk

Поделиться сообщением


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

Забавно. Я бы другой чип попробовал, если уверенность в правильности общения по SPI есть... CPOL/CPHA правильно настроены?

Поделиться сообщением


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

Может я ошибаюсь, но мне кажется, что дело в этом:

l11.thumb.jpg.07a3e1a474f7e6c05d3fa7168f09cdb8.jpg 

Думаю если Вы переключите настройки анализатора протокола на Faling Edge, то эти эфемерные единички при считывании данных пропадут.

 

Поделиться сообщением


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

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

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

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

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

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

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

×
×
  • Создать...