Last active
July 28, 2019 14:05
-
-
Save surinoel/474eb2969bdcd63c2034758ef5cd18aa to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* 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) | |
{ | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* 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