Учтено инвертирование ШИМ в третьей фазе Настроено масштабирование напряжение (вектор напряжения в вольтах, а не в процентах ШИМ) Напряжение моста фильтруется
243 lines
7.2 KiB
C
243 lines
7.2 KiB
C
/*
|
|
* BL25CM1A.c
|
|
*
|
|
* Created on: 7 ñåíò. 2023 ã.
|
|
* Author: seklyuts
|
|
*/
|
|
#include "f28x_project.h"
|
|
#include "spi_init.h"
|
|
|
|
#include "BL25CM1A.h"
|
|
#include "Arr.h"
|
|
|
|
#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
|
|
|
|
|
|
|
|
|
|
|
|
void Bl25cm1a_en(void)
|
|
{
|
|
volatile uint16_t empty;
|
|
Gpio_SPI_CS_BL25CM1A(0);
|
|
transmitData(WREN);
|
|
while(SpiRegs.SPIFFRX.bit.RXFFST != 1)
|
|
{
|
|
|
|
}
|
|
Gpio_SPI_CS_BL25CM1A(1);
|
|
empty = SpiRegs.SPIRXBUF;
|
|
}
|
|
|
|
uint16_t Bl25cm1a_ReadStatus(void)
|
|
{
|
|
volatile uint16_t empty;
|
|
Gpio_SPI_CS_BL25CM1A(0);
|
|
transmitData(RDSR);
|
|
transmitData(0xFF);
|
|
while(SpiRegs.SPIFFRX.bit.RXFFST != 2)
|
|
{
|
|
|
|
}
|
|
Gpio_SPI_CS_BL25CM1A(1);
|
|
empty = SpiRegs.SPIRXBUF;
|
|
empty = SpiRegs.SPIRXBUF;
|
|
return empty;
|
|
}
|
|
|
|
void Bl25cm1a_read_8_bytes(uint32_t Addr, uint16_t * read_data, uint16_t num_byte)//num_byte <=8
|
|
{
|
|
volatile uint16_t empty, i, j;
|
|
uint16_t Stat = 1;
|
|
|
|
Stat = Bl25cm1a_ReadStatus();
|
|
while((Stat&0x1) != 0 )
|
|
{
|
|
Stat = Bl25cm1a_ReadStatus();
|
|
}
|
|
Gpio_SPI_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))
|
|
{
|
|
|
|
}
|
|
Gpio_SPI_CS_BL25CM1A(1);
|
|
empty = SpiRegs.SPIRXBUF;
|
|
empty = SpiRegs.SPIRXBUF;
|
|
empty = SpiRegs.SPIRXBUF;
|
|
empty = SpiRegs.SPIRXBUF;
|
|
for(j = 0; j<num_byte; j++)
|
|
{
|
|
read_data[j] = SpiRegs.SPIRXBUF;
|
|
}
|
|
}
|
|
|
|
void Bl25cm1a_write_8_bytes(uint32_t Addr, uint16_t * write_data, uint16_t num_byte)//num_byte <=8
|
|
{
|
|
volatile uint16_t empty, i, j;
|
|
uint16_t Stat = 1;
|
|
|
|
Stat = Bl25cm1a_ReadStatus();
|
|
while((Stat&0x1) != 0 )
|
|
{
|
|
Stat = Bl25cm1a_ReadStatus();
|
|
}
|
|
|
|
Bl25cm1a_en();
|
|
Gpio_SPI_CS_BL25CM1A(0);
|
|
transmitData(WRITE);
|
|
transmitData(Addr>>16);
|
|
transmitData(Addr>>8);
|
|
transmitData(Addr);
|
|
for(i = 0; i<num_byte; i++) transmitData(write_data[i]);
|
|
while(SpiRegs.SPIFFRX.bit.RXFFST != (num_byte+4))
|
|
{
|
|
|
|
}
|
|
Gpio_SPI_CS_BL25CM1A(1);
|
|
empty = SpiRegs.SPIRXBUF;
|
|
empty = SpiRegs.SPIRXBUF;
|
|
empty = SpiRegs.SPIRXBUF;
|
|
empty = SpiRegs.SPIRXBUF;
|
|
for(j = 0; j<num_byte; j++)
|
|
{
|
|
empty = SpiRegs.SPIRXBUF;
|
|
}
|
|
}
|
|
|
|
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();
|
|
}
|
|
Gpio_SPI_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))
|
|
{
|
|
|
|
}
|
|
Gpio_SPI_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)
|
|
{ //â ýòîì öèêëå òîëüêî ïîëíûå ïîñûëêè ïî 8 áàéò
|
|
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)
|
|
{ //òóò ì.á. îò 1 äî 8 áàéò
|
|
Bl25cm1a_read_8_bytes(Addr+i, addr_read_data, (quant8 - i)); //÷èòàåì îñòàâøèåñÿ áàéòû
|
|
if((quant8 - i) & 1) {addr_read_data[quant8] = 0; quant8++; } //åñëè áàéò íå÷¸òíîå ÷èñëî, òî äîïîëíÿåì äî ÷¸òíîãî íóë¸ì ÷òîáû çàïèñàòü 16-áèòíûìè ñëîâàìè â áóôåð
|
|
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)
|
|
{ //â ýòîì öèêëå òîëüêî ïîëíûå ïîñûëêè ïî 8 áàéò
|
|
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)
|
|
{ //òóò ì.á. îò 1 äî 8 áàéò
|
|
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)
|
|
{ //â ýòîì öèêëå òîëüêî ïîëíûå ïîñûëêè ïî 8 áàéò
|
|
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)
|
|
{ //òóò ì.á. îò 1 äî 8 áàéò
|
|
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) //åñëè äàííûå âûõîäÿò çà ãðàíèöó òåêóùåé ñòðàíèöû
|
|
{
|
|
page_quant_8bit = BL25CM1A0_PAGE - (Addr_8bit&0xFF); //âû÷èñëÿåì êîë-âî áàéò äàííûõ äî êîíöà òåêóùåé ñòðàíèöû
|
|
Bl25cm1a_write_1_page(Addr_8bit, page_quant_8bit/2, addr_write_data); //çàïèñûâàåì ýòè äàííûå íà òåêóùóþ ñòðàíèöó
|
|
Addr_8bit += page_quant_8bit; //ïåðåëèñòûâàåì ñòðàíèöó âíåøíåé ïàìÿòè
|
|
addr_write_data += page_quant_8bit/2; //øàãàåì íà ñëåäóþùèå íåçàïèñàííûå äàííûå â áóôåðå
|
|
quant_8bit -= page_quant_8bit; //óìåíüøàåì êîë-âî äàííûõ íà âåëè÷èíó êîòîðóþ óæå çàïèñàëè
|
|
}
|
|
if(quant_8bit > 0)
|
|
{
|
|
Bl25cm1a_write_1_page(Addr_8bit, quant_8bit, addr_write_data); //åñëè äàííûå äëÿ çàïèñè îñòàëèñü, òî çàïèñûâàåì èõ
|
|
}
|
|
}
|