Untitled
unknown
c_cpp
4 years ago
3.4 kB
10
Indexable
/*
* flash.c
*
* Created on: Jul 22, 2021
* Author: David
*/
#include "main.h"
#include "flash.h"
#define CTRL_DIS 0xF8
#define A_1_DIS 0x08
#define E_DIS 0x10
#define G_DIS 0x20
//#define W_DIS 0x8
#define A_1_EN 0xF0 //TODO corregir
#define E_EN 0xE8
#define G_EN 0xD8
//#define W_EN 0x70
#define delay() asm("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop")
volatile uint16_t data;
volatile uint16_t count;
volatile uint32_t address;
volatile uint8_t diskStatus;
volatile uint8_t bufReady;
volatile uint8_t readPos;
volatile uint8_t writePos;
volatile uint8_t buf[bufNum][bufSz];
volatile uint8_t *readPtr=buf[0];
volatile uint8_t *writePtr=buf[0];
static uint8_t status=0;
void setDataDir(bool input){
GPIOA->MODER = input ? (GPIOA->MODER & 0xFFFF0000) : (GPIOA->MODER & 0xFFFF0000) | 0x5555;
}
void pulse(GPIO_TypeDef *GPIOx, uint32_t pin){
//delay();
GPIOx->BSRR=pin;
delay();
GPIOx->BSRR=pin<<16;
}
uint8_t read(void){
setDataDir(1);
delay();
OE_DATA_GPIO_Port->BSRR = OE_DATA_Pin<<16;
pulse(LE_DATA_GPIO_Port, LE_DATA_Pin);
uint8_t data = GPIOA->IDR & 0xFF;
OE_DATA_GPIO_Port->BSRR = OE_DATA_Pin;
delay();
setDataDir(0);
return data;
}
void flash_init(void){
setDataDir(0);
// All to 1 ( Disable state)
LE_ADR0_GPIO_Port->BSRR=LE_ADR0_Pin<<16;
LE_ADR1_GPIO_Port->BSRR=LE_ADR1_Pin<<16;
LE_ADR2_GPIO_Port->BSRR=LE_ADR2_Pin<<16;
LE_DATA_GPIO_Port->BSRR=LE_DATA_Pin<<16;
OE_DATA_GPIO_Port->BSRR=OE_DATA_Pin;
delay();
GPIOA->ODR &= ~(0xFF);
pulse(LE_ADR0_GPIO_Port, LE_ADR0_Pin);
pulse(LE_ADR1_GPIO_Port, LE_ADR1_Pin);
GPIOA->ODR |= CTRL_DIS;
pulse(LE_ADR2_GPIO_Port, LE_ADR2_Pin);
}
void fillBuffer(void){
count=0;
readPtr = buf[0];
while(count<bufSz){
// Load address with A-1=0
GPIOA->ODR = address & 0xFF;
pulse(LE_ADR0_GPIO_Port, LE_ADR0_Pin);
GPIOA->ODR = (address>>8) & 0xFF;
pulse(LE_ADR1_GPIO_Port, LE_ADR1_Pin);
GPIOA->ODR = ((address>>16) & 0xFF) | A_1_EN;
pulse(LE_ADR2_GPIO_Port, LE_ADR2_Pin);
// Enable CE
GPIOA->ODR = ((address>>16) & 0xFF) | (A_1_EN & E_EN);
pulse(LE_ADR2_GPIO_Port, LE_ADR2_Pin);
// Enable G
GPIOA->ODR = ((address>>16) & 0xFF) | (A_1_EN & E_EN & G_EN);
pulse(LE_ADR2_GPIO_Port, LE_ADR2_Pin);
// Read lower byte
*readPtr++=read();
// Deselect G
GPIOA->ODR = ((address>>16) & 0xFF) | (A_1_EN & E_EN);
pulse(LE_ADR2_GPIO_Port, LE_ADR2_Pin);
// Deselect E
GPIOA->ODR = ((address>>16) & 0xFF) | (A_1_EN);
pulse(LE_ADR2_GPIO_Port, LE_ADR2_Pin);
// Disable A-1
GPIOA->ODR = ((address>>16) & 0xFF) | CTRL_DIS;
pulse(LE_ADR2_GPIO_Port, LE_ADR2_Pin);
// Enable E
GPIOA->ODR = ((address>>16) & 0xFF) | E_EN;
pulse(LE_ADR2_GPIO_Port, LE_ADR2_Pin);
// Enable G
GPIOA->ODR = ((address>>16) & 0xFF) | (E_EN & G_EN);
pulse(LE_ADR2_GPIO_Port, LE_ADR2_Pin);
// Read higher byte
*readPtr++=read();
// Deselect G
GPIOA->ODR = ((address>>16) & 0xFF) | E_EN;
pulse(LE_ADR2_GPIO_Port, LE_ADR2_Pin);
// Deselect E
GPIOA->ODR = ((address>>16) & 0xFF) | CTRL_DIS;
pulse(LE_ADR2_GPIO_Port, LE_ADR2_Pin);
address++;
count+=2;
}
}
Editor is loading...