2023-09-14 14:39:29 +03:00
|
|
|
|
/*
|
|
|
|
|
|
* BL25CM1A.c
|
|
|
|
|
|
*
|
|
|
|
|
|
* Created on: 7 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>. 2023 <EFBFBD>.
|
|
|
|
|
|
* Author: seklyuts
|
|
|
|
|
|
*/
|
|
|
|
|
|
#include "f28x_project.h"
|
|
|
|
|
|
#include "spi_init.h"
|
|
|
|
|
|
|
2023-12-19 10:49:45 +03:00
|
|
|
|
#include "BL25CM1A.h"
|
|
|
|
|
|
#include "Arr.h"
|
|
|
|
|
|
|
2023-09-14 14:39:29 +03:00
|
|
|
|
#define WREN 0b00000110 //Enable Write Operations
|
|
|
|
|
|
#define WRDI 0b00000100 //Disable Write Operations
|
|
|
|
|
|
#define RDSR 0b00000101 //Read Status Register
|
|
|
|
|
|
#define WRSR 0b00000001 //Write Status Register
|
|
|
|
|
|
#define READ 0b00000011 //Read Data from Memory
|
|
|
|
|
|
#define WRITE 0b00000010 //Write Data to Memory
|
|
|
|
|
|
#define RDID 0b10000011 //Read identification page
|
|
|
|
|
|
#define WRID 0b10000010 //Write identification page
|
|
|
|
|
|
#define RDLS 0b10000011 //Reads the identification page lock status
|
|
|
|
|
|
#define LID 0b10000010 //Locks the identification page in read-only mode
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-12-19 10:49:45 +03:00
|
|
|
|
|
|
|
|
|
|
|
2023-09-14 14:39:29 +03:00
|
|
|
|
|
|
|
|
|
|
void Bl25cm1a_en(void)
|
|
|
|
|
|
{
|
2023-09-26 08:51:03 +03:00
|
|
|
|
volatile uint16_t empty;
|
2023-12-19 10:49:45 +03:00
|
|
|
|
Gpio15outSPI_CS_BL25CM1A(0);
|
2023-09-26 08:51:03 +03:00
|
|
|
|
transmitData(WREN);
|
|
|
|
|
|
while(SpiRegs.SPIFFRX.bit.RXFFST != 1)
|
2023-09-14 14:39:29 +03:00
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2023-12-19 10:49:45 +03:00
|
|
|
|
Gpio15outSPI_CS_BL25CM1A(1);
|
2023-09-26 08:51:03 +03:00
|
|
|
|
empty = SpiRegs.SPIRXBUF;
|
2023-09-14 14:39:29 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-19 10:49:45 +03:00
|
|
|
|
uint16_t Bl25cm1a_ReadStatus(void)
|
2023-09-14 14:39:29 +03:00
|
|
|
|
{
|
2023-12-19 10:49:45 +03:00
|
|
|
|
volatile uint16_t empty;
|
|
|
|
|
|
Gpio15outSPI_CS_BL25CM1A(0);
|
|
|
|
|
|
transmitData(RDSR);
|
|
|
|
|
|
transmitData(0xFF);
|
|
|
|
|
|
while(SpiRegs.SPIFFRX.bit.RXFFST != 2)
|
|
|
|
|
|
{
|
2023-09-14 14:39:29 +03:00
|
|
|
|
|
2023-12-19 10:49:45 +03:00
|
|
|
|
}
|
|
|
|
|
|
Gpio15outSPI_CS_BL25CM1A(1);
|
|
|
|
|
|
empty = SpiRegs.SPIRXBUF;
|
|
|
|
|
|
empty = SpiRegs.SPIRXBUF;
|
|
|
|
|
|
return empty;
|
2023-09-26 08:51:03 +03:00
|
|
|
|
}
|
2023-09-14 14:39:29 +03:00
|
|
|
|
|
2023-12-19 10:49:45 +03:00
|
|
|
|
void Bl25cm1a_read_8_bytes(uint32_t Addr, uint16_t * read_data, uint16_t num_byte)//num_byte <=8
|
2023-09-26 08:51:03 +03:00
|
|
|
|
{
|
|
|
|
|
|
volatile uint16_t empty, i, j;
|
2023-12-19 10:49:45 +03:00
|
|
|
|
uint16_t Stat = 1;
|
|
|
|
|
|
|
|
|
|
|
|
Stat = Bl25cm1a_ReadStatus();
|
|
|
|
|
|
while((Stat&0x1) != 0 )
|
|
|
|
|
|
{
|
|
|
|
|
|
Stat = Bl25cm1a_ReadStatus();
|
|
|
|
|
|
}
|
|
|
|
|
|
Gpio15outSPI_CS_BL25CM1A(0);
|
2023-09-26 08:51:03 +03:00
|
|
|
|
transmitData(READ);
|
|
|
|
|
|
transmitData(Addr>>16);
|
|
|
|
|
|
transmitData(Addr>>8);
|
|
|
|
|
|
transmitData(Addr);
|
2023-12-19 10:49:45 +03:00
|
|
|
|
for(i = 0; i<num_byte; i++) transmitData(0xFF);
|
|
|
|
|
|
while(SpiRegs.SPIFFRX.bit.RXFFST != (num_byte+4))
|
2023-09-26 08:51:03 +03:00
|
|
|
|
{
|
2023-09-14 14:39:29 +03:00
|
|
|
|
|
2023-09-26 08:51:03 +03:00
|
|
|
|
}
|
2023-12-19 10:49:45 +03:00
|
|
|
|
Gpio15outSPI_CS_BL25CM1A(1);
|
2023-09-26 08:51:03 +03:00
|
|
|
|
empty = SpiRegs.SPIRXBUF;
|
|
|
|
|
|
empty = SpiRegs.SPIRXBUF;
|
|
|
|
|
|
empty = SpiRegs.SPIRXBUF;
|
|
|
|
|
|
empty = SpiRegs.SPIRXBUF;
|
2023-12-19 10:49:45 +03:00
|
|
|
|
for(j = 0; j<num_byte; j++)
|
2023-09-26 08:51:03 +03:00
|
|
|
|
{
|
2023-12-19 10:49:45 +03:00
|
|
|
|
read_data[j] = SpiRegs.SPIRXBUF;
|
2023-09-26 08:51:03 +03:00
|
|
|
|
}
|
2023-09-14 14:39:29 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-19 10:49:45 +03:00
|
|
|
|
void Bl25cm1a_write_8_bytes(uint32_t Addr, uint16_t * write_data, uint16_t num_byte)//num_byte <=8
|
2023-09-14 14:39:29 +03:00
|
|
|
|
{
|
2023-09-26 08:51:03 +03:00
|
|
|
|
volatile uint16_t empty, i, j;
|
2023-12-19 10:49:45 +03:00
|
|
|
|
uint16_t Stat = 1;
|
|
|
|
|
|
|
|
|
|
|
|
Stat = Bl25cm1a_ReadStatus();
|
|
|
|
|
|
while((Stat&0x1) != 0 )
|
|
|
|
|
|
{
|
|
|
|
|
|
Stat = Bl25cm1a_ReadStatus();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Bl25cm1a_en();
|
|
|
|
|
|
Gpio15outSPI_CS_BL25CM1A(0);
|
2023-09-26 08:51:03 +03:00
|
|
|
|
transmitData(WRITE);
|
|
|
|
|
|
transmitData(Addr>>16);
|
|
|
|
|
|
transmitData(Addr>>8);
|
|
|
|
|
|
transmitData(Addr);
|
2023-12-19 10:49:45 +03:00
|
|
|
|
for(i = 0; i<num_byte; i++) transmitData(write_data[i]);
|
|
|
|
|
|
while(SpiRegs.SPIFFRX.bit.RXFFST != (num_byte+4))
|
2023-09-26 08:51:03 +03:00
|
|
|
|
{
|
2023-09-14 14:39:29 +03:00
|
|
|
|
|
2023-09-26 08:51:03 +03:00
|
|
|
|
}
|
2023-12-19 10:49:45 +03:00
|
|
|
|
Gpio15outSPI_CS_BL25CM1A(1);
|
2023-09-26 08:51:03 +03:00
|
|
|
|
empty = SpiRegs.SPIRXBUF;
|
|
|
|
|
|
empty = SpiRegs.SPIRXBUF;
|
|
|
|
|
|
empty = SpiRegs.SPIRXBUF;
|
|
|
|
|
|
empty = SpiRegs.SPIRXBUF;
|
2023-12-19 10:49:45 +03:00
|
|
|
|
for(j = 0; j<num_byte; j++)
|
2023-09-26 08:51:03 +03:00
|
|
|
|
{
|
|
|
|
|
|
empty = SpiRegs.SPIRXBUF;
|
|
|
|
|
|
}
|
2023-09-14 14:39:29 +03:00
|
|
|
|
}
|
2023-12-19 10:49:45 +03:00
|
|
|
|
|
|
|
|
|
|
uint16_t Bl25cm1a_verify_8_bytes(uint32_t Addr, uint16_t * verify_data, uint16_t num_byte)//num_byte <=8
|
|
|
|
|
|
{
|
|
|
|
|
|
volatile uint16_t empty, i, j;
|
|
|
|
|
|
uint16_t Stat = 1;
|
|
|
|
|
|
uint16_t Err = 0;
|
|
|
|
|
|
|
|
|
|
|
|
Stat = Bl25cm1a_ReadStatus();
|
|
|
|
|
|
while((Stat&0x1) != 0 )
|
|
|
|
|
|
{
|
|
|
|
|
|
Stat = Bl25cm1a_ReadStatus();
|
|
|
|
|
|
}
|
|
|
|
|
|
Gpio15outSPI_CS_BL25CM1A(0);
|
|
|
|
|
|
transmitData(READ);
|
|
|
|
|
|
transmitData(Addr>>16);
|
|
|
|
|
|
transmitData(Addr>>8);
|
|
|
|
|
|
transmitData(Addr);
|
|
|
|
|
|
for(i = 0; i<num_byte; i++) transmitData(0xFF);
|
|
|
|
|
|
while(SpiRegs.SPIFFRX.bit.RXFFST != (num_byte+4))
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
Gpio15outSPI_CS_BL25CM1A(1);
|
|
|
|
|
|
empty = SpiRegs.SPIRXBUF;
|
|
|
|
|
|
empty = SpiRegs.SPIRXBUF;
|
|
|
|
|
|
empty = SpiRegs.SPIRXBUF;
|
|
|
|
|
|
empty = SpiRegs.SPIRXBUF;
|
|
|
|
|
|
for(j = 0; j<num_byte; j++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(verify_data[j] != SpiRegs.SPIRXBUF) Err++;
|
|
|
|
|
|
}
|
|
|
|
|
|
return Err;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Bl25cm1a_read_data(uint32_t Addr, uint16_t quant8, uint16_t * read_data)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint32_t i=0;
|
|
|
|
|
|
uint16_t addr_read_data[8];
|
|
|
|
|
|
|
|
|
|
|
|
if(quant8 > 8)
|
|
|
|
|
|
{
|
|
|
|
|
|
for(i = 0; i < (quant8-8); i += 8)
|
|
|
|
|
|
{ //<2F> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> 8 <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
Bl25cm1a_read_8_bytes(Addr+i, addr_read_data, 8);
|
|
|
|
|
|
copy8_to_16(addr_read_data, read_data, 4);
|
|
|
|
|
|
read_data+=4;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if(i < quant8)
|
|
|
|
|
|
{ //<2F><><EFBFBD> <20>.<2E>. <20><> 1 <20><> 8 <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
Bl25cm1a_read_8_bytes(Addr+i, addr_read_data, (quant8 - i)); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if((quant8 - i) & 1) {addr_read_data[quant8] = 0; quant8++; } //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 16-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
copy8_to_16(addr_read_data, read_data, (quant8 - i)/2);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint16_t Bl25cm1a_verify_data(uint32_t Addr, uint16_t quant8, uint16_t * verify_data)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint32_t i=0;
|
|
|
|
|
|
uint16_t addr_vfy_data[8];
|
|
|
|
|
|
uint16_t quant16;
|
|
|
|
|
|
|
|
|
|
|
|
if(quant8 > 8)
|
|
|
|
|
|
{
|
|
|
|
|
|
for(i = 0; i < (quant8-8); i += 8)
|
|
|
|
|
|
{ //<2F> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> 8 <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
copy16_to_8(verify_data, addr_vfy_data, 4);
|
|
|
|
|
|
if(Bl25cm1a_verify_8_bytes(Addr+i, addr_vfy_data, 8)) return 1;
|
|
|
|
|
|
verify_data+=4;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if(i < quant8)
|
|
|
|
|
|
{ //<2F><><EFBFBD> <20>.<2E>. <20><> 1 <20><> 8 <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
quant16 = quant16bitWords(quant8-i);
|
|
|
|
|
|
copy16_to_8(verify_data, addr_vfy_data, quant16);
|
|
|
|
|
|
if(Bl25cm1a_verify_8_bytes(Addr+i, addr_vfy_data, (quant8 - i))) return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Bl25cm1a_write_1_page(uint32_t Addr, uint16_t quant8, uint16_t * write_data)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint32_t i=0;
|
|
|
|
|
|
uint16_t addr_write_data[8];
|
|
|
|
|
|
uint16_t quant16;
|
|
|
|
|
|
|
|
|
|
|
|
if(quant8 > 8)
|
|
|
|
|
|
{
|
|
|
|
|
|
for(i = 0; i < (quant8-8); i += 8)
|
|
|
|
|
|
{ //<2F> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> 8 <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
copy16_to_8(write_data, addr_write_data, 4);
|
|
|
|
|
|
Bl25cm1a_write_8_bytes(Addr+i, addr_write_data, 8);
|
|
|
|
|
|
write_data += 4;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if(i < quant8)
|
|
|
|
|
|
{ //<2F><><EFBFBD> <20>.<2E>. <20><> 1 <20><> 8 <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
quant16 = quant16bitWords(quant8-i);
|
|
|
|
|
|
copy16_to_8(write_data, addr_write_data, quant16);
|
|
|
|
|
|
Bl25cm1a_write_8_bytes(Addr+i, addr_write_data, (quant8 - i));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Bl25cm1a_write_data(uint32_t Addr_8bit, uint16_t quant_8bit, uint16_t * write_data)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint16_t * addr_write_data = write_data;
|
|
|
|
|
|
uint16_t page_quant_8bit = 0;
|
|
|
|
|
|
|
|
|
|
|
|
while( (Addr_8bit&0xFF)+(quant_8bit) > BL25CM1A0_PAGE) //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
page_quant_8bit = BL25CM1A0_PAGE - (Addr_8bit&0xFF); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>-<2D><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
Bl25cm1a_write_1_page(Addr_8bit, page_quant_8bit/2, addr_write_data); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
Addr_8bit += page_quant_8bit; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
addr_write_data += page_quant_8bit/2; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
quant_8bit -= page_quant_8bit; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>-<2D><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
}
|
|
|
|
|
|
if(quant_8bit > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
Bl25cm1a_write_1_page(Addr_8bit, quant_8bit, addr_write_data); //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|