Skip to content

Instantly share code, notes, and snippets.

@surinoel
Last active July 28, 2019 14:05
Show Gist options
  • Save surinoel/474eb2969bdcd63c2034758ef5cd18aa to your computer and use it in GitHub Desktop.
Save surinoel/474eb2969bdcd63c2034758ef5cd18aa to your computer and use it in GitHub Desktop.
/*
* w25q64_readwrite.c
*
* Created: 2019-07-28 오후 4:47:14
* Author : yeong
*/
#define F_CPU 16000000UL
#include <util/delay.h>
#include <avr/io.h>
#include "uart.h"
#include "spi.h"
#include "w25q64.h"
uint8_t wData[0x100];
uint8_t rData[0x100];
int main(void)
{
spi_init();
uart0_init();
// CS init
w25q_ss_pin_init();
w25q_ss_pin_drive(LOGIC_HIGH);
for(int i=0; i<0x100; i++) {
wData[i] = i;
rData[i] = 0;
}
w25q_write_enable();
while(getstatus());
w25q_page_write(0x00, wData, 0x100);
while(getstatus());
for(int i=0; i<0x100; i++) {
rData[i] = w25q_read(i);
printf("%d\r\n", rData[i]);
_delay_ms(100);
}
while (1)
{
}
}
/*
* w25q64.c
*
* Created: 2019-07-14 오전 4:16:22
* Author: yeong
*/
#include "w25q64.h"
/** @brief: initialize the ss pin
*/
void w25q_ss_pin_init(void)
{
W25Q_CONTROL_DDR |= (1<<W25Q_SS_PIN); // Set as output
}
/** @brief: drives the ss pin
*/
void w25q_ss_pin_drive(uint8_t high)
{
if(high)
{
W25Q_CONTROL_PORT |= (1<<W25Q_SS_PIN);
}
else
{
W25Q_CONTROL_PORT &= ~(1<<W25Q_SS_PIN);
}
}
/** @brief: return the manufacturer ID
*/
char w25q_read_manufacturer_id(void)
{
w25q_ss_pin_drive(LOGIC_LOW);
spi_transmit(0x90);
spi_transmit(0x00);
spi_transmit(0x00);
spi_transmit(0x00);
uint8_t man_id = spi_transmit(0x00);
spi_transmit(0x00);
w25q_ss_pin_drive(LOGIC_HIGH);
return man_id;
}
/** @brief: return the device ID
*/
char w25q_read_device_id(void)
{
w25q_ss_pin_drive(LOGIC_LOW);
spi_transmit(0x90);
spi_transmit(0x00);
spi_transmit(0x00);
spi_transmit(0x00);
spi_transmit(0x00);
uint8_t dev_id = spi_transmit(0x00);
w25q_ss_pin_drive(LOGIC_HIGH);
return dev_id;
}
void w25q_write_enable(void)
{
w25q_ss_pin_drive(LOGIC_LOW);
spi_transmit(0x06);
w25q_ss_pin_drive(LOGIC_HIGH);
}
void w25q_page_write(uint32_t addr, uint8_t *data, uint32_t size)
{
uint8_t cmd[3];
cmd[0] = (addr >> 16) & 0xFF;
cmd[1] = (addr >> 8) & 0xFF;
cmd[2] = addr & 0xFF;
w25q_ss_pin_drive(LOGIC_LOW);
w25q_write_enable();
spi_transmit(0x02);
spi_transmit(cmd[0]);
spi_transmit(cmd[1]);
spi_transmit(cmd[2]);
for(int i=0; i<size; i++) {
while(getstatus());
spi_transmit(data[i]);
}
w25q_ss_pin_drive(LOGIC_HIGH);
}
uint8_t w25q_read(uint32_t addr)
{
uint8_t ret;
uint8_t cmd[3];
cmd[0] = (addr >> 16) & 0xFF;
cmd[1] = (addr >> 8) & 0xFF;
cmd[2] = addr & 0xFF;
w25q_ss_pin_drive(LOGIC_LOW);
spi_transmit(0x03);
spi_transmit(cmd[0]);
spi_transmit(cmd[1]);
spi_transmit(cmd[2]);
ret = spi_transmit(0x00);
w25q_ss_pin_drive(LOGIC_HIGH);
return ret;
}
uint8_t getstatus(void) {
uint8_t ret;
w25q_ss_pin_drive(LOGIC_LOW);
spi_transmit(0x05);
ret = spi_transmit(0x00);
w25q_ss_pin_drive(LOGIC_HIGH);
return (ret & 0x01);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment