cómo almacenar una matriz de valores enteros largos en una memoria de 16 bits

0

Estoy intentando almacenar valores "long int" en la memoria ( SM28VLT32 ) A través de la comunicación SPI. Estoy usando el compilador IAR. La memoria es de 16 bits de acceso de lectura o escritura. Me gustaría almacenar valores de más de 16 bits como "3245672341" y algunas veces valores flotantes. Ej: "5008.456". Puedo convertir float a int, entonces el entero será mayor que el valor de 16 bits. Tengo que almacenar una matriz de [6] valores "long int" cada minuto a la memoria. No puedo almacenar valores enteros largos en la memoria, ya que tiene acceso de lectura y escritura de 16 bits.

Estoy pensando en convertir "long int" a "string"! ¿Alguna sugerencia sobre cómo puedo almacenar esos valores y debo usar menos memoria?

Actualmente puedo almacenar un valor entero de 16 bits utilizando el código siguiente.

unsigned int sampledata[5]= {34586, 43877,53780, 64879,1}; 
FlashPointer = 2;

int StoreToFlash(unsigned int sampledata[], int StartAddress);  // Strore Sample to flash

StoreToFlash(sampledata, FlashPointer);   //function calling

int StoreToFlash(long int sampledata[], int StartAddress)
{   
int iCtr;
int ErrorCode = 0;
int address = StartAddress;

// Write to flash
for(iCtr=0;iCtr<5;iCtr++)
{   
    ErrorCode = Flash_Write(address++, sampledata[iCtr]);
    if((ErrorCode &0x45)!= 0)
    {
      Flash_ClearError();          
    }
}
return ErrorCode;
}

int Flash_Write(int Address, long int Data)   //Flash wirte function
{ 
int error ;
int data0 = 0;

// Make chip select Low
Flash_Set_CS_Status(0);

// Send Command ID 0x17
data0 = Flash_SPI_SendByte(0x17);

// Send Address Byte 3
data0 = Flash_SPI_SendByte((Address & 0xFF0000) >> 16);    

// Send Address Byte 2
data0 = Flash_SPI_SendByte((Address & 0xFF00) >> 8);

// Send Address Byte 1
data0 = Flash_SPI_SendByte(Address & 0xFF);

// Send Data Byte MSB
data0 = Flash_SPI_SendByte((Data & 0xFF00) >> 8);

// Send Data Byte LSB
data0 = Flash_SPI_SendByte(Data & 0xFF);

// Send Dummy Byte
data0 = Flash_SPI_SendByte(0);

// Make Chip select high
Flash_Set_CS_Status(1);  
}

How can i store sampledata[5]= {3456782676, 3890.345, 5035.675, 1, 64534}?
    
pregunta verendra

1 respuesta

1

Por lo tanto, el flash que está utilizando solo admite la escritura de una palabra de 16 bits a la vez y no se puede acceder a él de otra manera (es un poco extraño). Debido a eso, tendrá que hacer un poco de administración de direcciones manual, pero el flash afortunadamente viene con una dirección de escritura de incremento automático.

De todos modos, como puede transferir solo un byte a través de SPI (hay algunas variantes de 16 bits, pero olvidémonos de ellas por un minuto, aunque sería lo más apropiado aquí), la forma más natural de interactuar con ellas es con matrices de bytes.

Así que cambiaría el Flash_Write así:

long int Start_Flash_Write(int StartAddress, unsigned char* Data, long int Datacount, const unsigned char FINISH_BYTE)
{
    long int dataSent = 0;
    // Make chip select Low
    Flash_Set_CS_Status(0);

    // Send Command ID 0x17
    data0 = Flash_SPI_SendByte(0x17);

    // Send Address Byte 3
    data0 = Flash_SPI_SendByte((StartAddress & 0xFF0000) >> 16);    

    // Send Address Byte 2
    data0 = Flash_SPI_SendByte((StartAddress & 0xFF00) >> 8);

    // Send Address Byte 1
    data0 = Flash_SPI_SendByte(StartAddress & 0xFF);

    // Send first two DataBytes
    data0 = Flash_SPI_SendByte(Data[dataSent++]);
    if (dataSent < (Datacount))
    {
        data0 = Flash_SPI_SendByte(Data[dataSent++]);
    }
    else
    {
        data0 = Flash_SPI_SendByte(FINISH_BYTE);
    }
    // Send Dummy Byte
    data0 = Flash_SPI_SendByte(0);

    // Make Chip select high
    Flash_Set_CS_Status(1);

    return dataSent;

}

int Flash_Write(int StartAddress, unsigned char* Data, long int Datacount)   //Flash wirte function
{ 
    int error ;
    int data0 = 0;
    long int dataSent;
    const unsigned char FINISH_BYTE  = 0xFF;

    if (Datacount == 0)
    {
        return 0; // writing nothing is easy
    }

    // First Write sets StartAddress
    dataSent = Start_Flash_Write(StartAddress, Data, Datacount, FINISH_BYTE);

    while (dataSent < (Datacount))
    {
        // Make chip select Low
        Flash_Set_CS_Status(0);

        // Send Command ID 0x18 (auto increment write)
        data0 = Flash_SPI_SendByte(0x18);

        // Send first two DataBytes
        data0 = Flash_SPI_SendByte(Data[dataSent++]);
        if (dataSent < (Datacount))
        {
            data0 = Flash_SPI_SendByte(Data[dataSent++]);
        }
        else
        {
            data0 = Flash_SPI_SendByte(FINISH_BYTE);
        }

        // Send Dummy Byte
        data0 = Flash_SPI_SendByte(0);

        // Make Chip select high
        Flash_Set_CS_Status(1); 
    }
}

Y luego lo llamarías así:

Flash_Write(0x1234, (unsigned char*)(sampledata), sizeof(sampledata))

Cómo funciona:

Comienza con la escritura de la Dirección de inicio y los dos primeros bytes en la memoria flash. Luego escribe los bytes como un par en la siguiente dirección usando el modo de incremento automático de la memoria flash.

Como el recuento de bytes de datos puede no ser uniforme, verifico si se ha alcanzado el recuento de datos después de que se escribe cada byte. Si ese es el caso, se usa una constante FINISH_BYTE para finalizar la transferencia de manera normal.

Notas:

Recomiendo encarecidamente que no se utilicen tipos de datos integrales directamente, ya que nadie puede saber qué tan grandes son en realidad (¿es un int 16 o 32 bit de ancho?).

La cuenta de datos se debe pasar a la función, ya que la información sobre el tamaño de la matriz se pierde cuando se convierte en un puntero y queda fuera del alcance.

La función no devuelve algo, eso debería ser arreglado. El error no se usa.

    
respondido por el Arsenal

Lea otras preguntas en las etiquetas