at24c02和w25q64各自的功能是什么?它们的区别在哪?能用于一个原理图吗?
时间: 2024-04-20 13:25:04 浏览: 20
AT24C02和W25Q64都是常见的存储芯片,但功能和特性有所不同。
AT24C02是一个串行EEPROM芯片,容量为2KB,主要用于存储小量数据。它通过I2C总线进行通信,可以读取和写入数据,并且支持多个设备在同一总线上共享。
W25Q64是一个闪存芯片,容量为64MB,主要用于存储大量数据。它通过SPI总线进行通信,支持快速读取和写入操作,还具有片内擦除和编程功能。
这两种芯片的主要区别在于容量和通信接口。AT24C02适合存储小容量数据,适用于一些简单的应用场景。而W25Q64适用于需要存储大量数据的复杂应用,比如图像、音频和视频数据等。
至于能否在同一个原理图中使用,这取决于具体的设计需求和使用场景。如果需要同时使用I2C和SPI接口的话,可以将它们分别连接到不同的控制器或者其他器件上。但需要注意的是,在设计时要确保电路连接正确,并避免冲突或干扰。
相关问题
stm32f103c8t6 模拟iIC驱动at24c02 和模拟spi 驱动的w25q64代码
以下是stm32f103c8t6模拟iIC驱动at24c02和模拟spi驱动的w25q64的代码示例:
模拟iIC驱动at24c02代码:
```
#include "stm32f10x.h"
#define ADDR_AT24C02 0xA0
void I2C1_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE);
}
void I2C1_Mode_Config(void)
{
I2C_InitTypeDef I2C_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
I2C_DeInit(I2C1);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 100000;
I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1, ENABLE);
}
uint8_t I2C1_WriteByte(uint8_t dev_addr, uint8_t reg_addr, uint8_t data)
{
I2C_GenerateSTART(I2C1, ENABLE);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1, dev_addr, I2C_Direction_Transmitter);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C1, reg_addr);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1, data);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(I2C1, ENABLE);
return 0;
}
uint8_t I2C1_ReadByte(uint8_t dev_addr, uint8_t reg_addr)
{
uint8_t data;
I2C_GenerateSTART(I2C1, ENABLE);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1, dev_addr, I2C_Direction_Transmitter);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C1, reg_addr);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTART(I2C1, ENABLE);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1, dev_addr, I2C_Direction_Receiver);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
I2C_AcknowledgeConfig(I2C1, DISABLE);
I2C_GenerateSTOP(I2C1, ENABLE);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
data = I2C_ReceiveData(I2C1);
return data;
}
void AT24C02_Write(uint8_t addr, uint8_t data)
{
I2C1_WriteByte(ADDR_AT24C02, addr, data);
}
uint8_t AT24C02_Read(uint8_t addr)
{
return I2C1_ReadByte(ADDR_AT24C02, addr);
}
int main()
{
I2C1_GPIO_Config();
I2C1_Mode_Config();
uint8_t data = 0x55;
AT24C02_Write(0x00, data);
data = AT24C02_Read(0x00);
while (1);
}
```
模拟spi驱动的w25q64代码:
```
#include "stm32f10x.h"
#include "spi.h"
#include "w25q64.h"
void W25Q64_Init(void)
{
SPI2_Init();
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_12);
}
uint8_t W25Q64_ReadSR1(void)
{
uint8_t cmd = W25Q64_CMD_READ_SR1;
uint8_t sr1;
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
SPI2_WriteByte(cmd);
sr1 = SPI2_ReadByte();
GPIO_SetBits(GPIOB, GPIO_Pin_12);
return sr1;
}
void W25Q64_WriteEnable(void)
{
uint8_t cmd = W25Q64_CMD_WRITE_ENABLE;
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
SPI2_WriteByte(cmd);
GPIO_SetBits(GPIOB, GPIO_Pin_12);
}
void W25Q64_EraseChip(void)
{
uint8_t cmd = W25Q64_CMD_ERASE_CHIP;
W25Q64_WriteEnable();
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
SPI2_WriteByte(cmd);
GPIO_SetBits(GPIOB, GPIO_Pin_12);
while (W25Q64_ReadSR1() & 0x01);
}
void W25Q64_WritePage(uint32_t addr, uint8_t *data, uint16_t len)
{
uint8_t cmd[4];
uint32_t i;
cmd[0] = W25Q64_CMD_PAGE_PROGRAM;
cmd[1] = (addr >> 16) & 0xFF;
cmd[2] = (addr >> 8) & 0xFF;
cmd[3] = addr & 0xFF;
W25Q64_WriteEnable();
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
for (i = 0; i < 4; i++) {
SPI2_WriteByte(cmd[i]);
}
for (i = 0; i < len; i++) {
SPI2_WriteByte(data[i]);
}
GPIO_SetBits(GPIOB, GPIO_Pin_12);
while (W25Q64_ReadSR1() & 0x01);
}
void W25Q64_ReadData(uint32_t addr, uint8_t *data, uint16_t len)
{
uint8_t cmd[4];
uint32_t i;
cmd[0] = W25Q64_CMD_READ_DATA;
cmd[1] = (addr >> 16) & 0xFF;
cmd[2] = (addr >> 8) & 0xFF;
cmd[3] = addr & 0xFF;
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
for (i = 0; i < 4; i++) {
SPI2_WriteByte(cmd[i]);
}
for (i = 0; i < len; i++) {
data[i] = SPI2_ReadByte();
}
GPIO_SetBits(GPIOB, GPIO_Pin_12);
}
int main()
{
W25Q64_Init();
uint8_t data[256];
uint32_t i;
for (i = 0; i < 256; i++) {
data[i] = i;
}
W25Q64_EraseChip();
for (i = 0; i < 65536; i += 256) {
W25Q64_WritePage(i, data, 256);
}
for (i = 0; i < 65536; i += 256) {
W25Q64_ReadData(i, data, 256);
/* do something with data */
}
while (1);
}
```
能给一个at24c256的C语言驱动代码吗?
当然可以,以下是一个基于I2C总线的AT24C256 EEPROM的C语言驱动代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/i2c-dev.h>
#include <sys/ioctl.h>
#define I2C_BUS "/dev/i2c-1"
#define EEPROM_ADDR 0x50
int i2c_fd;
void i2c_init() {
i2c_fd = open(I2C_BUS, O_RDWR);
if (i2c_fd < 0) {
perror("open i2c bus failed");
exit(EXIT_FAILURE);
}
}
void i2c_deinit() {
close(i2c_fd);
}
int i2c_write(unsigned char *buf, int len) {
if (write(i2c_fd, buf, len) != len) {
perror("write i2c bus failed");
return -1;
}
return 0;
}
int i2c_read(unsigned char *buf, int len) {
if (read(i2c_fd, buf, len) != len) {
perror("read i2c bus failed");
return -1;
}
return 0;
}
void eeprom_write(unsigned short addr, unsigned char *buf, int len) {
unsigned char write_buf[256];
int i;
write_buf[0] = addr >> 8;
write_buf[1] = addr & 0xFF;
for (i = 0; i < len; i++) {
write_buf[i + 2] = buf[i];
}
i2c_write(write_buf, len + 2);
usleep(10000); // 10ms delay
}
void eeprom_read(unsigned short addr, unsigned char *buf, int len) {
unsigned char write_buf[2];
write_buf[0] = addr >> 8;
write_buf[1] = addr & 0xFF;
i2c_write(write_buf, 2);
i2c_read(buf, len);
}
int main() {
unsigned char buf[256];
unsigned short addr = 0x0000;
int i;
i2c_init();
// write data to eeprom
for (i = 0; i < 256; i++) {
buf[i] = i;
}
eeprom_write(addr, buf, 256);
// read data from eeprom
for (i = 0; i < 256; i++) {
buf[i] = 0;
}
eeprom_read(addr, buf, 256);
for (i = 0; i < 256; i++) {
printf("%02X ", buf[i]);
if ((i + 1) % 16 == 0) {
printf("\n");
}
}
i2c_deinit();
return 0;
}
```
这是一个基本的驱动程序框架,你可以根据具体的应用场景进行修改和优化。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)