樓管大叔來催了,實驗室要關門了,我今天就先把代碼放著了,后期再做詳細說明:
~~~
/* at24c02.c */
#include <stm32f10x.h>
#include "init.h"
#include "iic.h"
#define send_slave_addr(a) iic_send_byte(a)
#define send_rom_addr(a) iic_send_byte(a)
#define ROM_SIZE (2*1024) //2K
#define ADDR_SIZE 256
#define PAGE_SIZE 8
#define PAGE 32
int at24c02_init(unsigned char slave_addr)
{
iic_init();
iic_start();
send_slave_addr(slave_addr|IIC_WRITE);
if(iic_recv_ack())
return 0;
else
return 1;
}
int set_rom_addr(unsigned addr)
{
send_rom_addr(addr);
if(iic_recv_ack())
return 0;
else
return 1;
}
int at24c02_write_unpage( unsigned char slave_addr,
unsigned char start_addr,
char buff[],
unsigned char size)
{
delay_ms(1);
if(0 == at24c02_init(slave_addr))
return -1;
if(0 == set_rom_addr(start_addr))
return -1;
if(size > iic_send_str(buff,size))
{
iic_stop();
return 0;
}
else
{
iic_stop();
return 1;
}
}
int at24c02_write_page(unsigned char slave_addr,
unsigned char start_addr,
char buff[])
{
delay_ms(1);
if(0 == at24c02_init(slave_addr))
return -1;
if(0 == set_rom_addr(start_addr))
return -1;
if(8 > iic_send_str(buff,8))
{
iic_stop();
return 0;
}
else
{
iic_stop();
return 1;
}
}
int at24c02_write(unsigned char slave_addr,
unsigned char start_addr,
char buff[],
unsigned char size)
{
unsigned char addr = 0;
unsigned char send_byte;
unsigned char i;
char temp;
addr = 8 + ((unsigned char)(start_addr/8))*8;//Get Next Page Frist Address
send_byte = addr - start_addr;
if(size <= send_byte)
{
if(-1 == at24c02_write_unpage(slave_addr,start_addr,buff,size))
return -1;
else
return 0;
}
else
{
if(-1 == at24c02_write_unpage(slave_addr,start_addr,buff,send_byte))
return -1;
}
size -= send_byte;
buff += send_byte;
delay_ms(5);
temp = (char)(size/8);
for(i=0; i<temp;i++)
{
start_addr = addr;
if(-1 == at24c02_write_page(slave_addr,start_addr,buff))
return -1;
addr += 8;
size -= 8;
buff += 8;
delay_ms(5);
}
start_addr = addr;
if(-1 == at24c02_write_unpage(slave_addr,start_addr,buff,size))
return -1;
return 0;
}
int at24c02_read( unsigned char slave_addr,
unsigned char start_addr,
char buff[],
unsigned char size)
{
delay_ms(1);
if(0 == at24c02_init(slave_addr))
return -1;
if(0 == set_rom_addr(start_addr))
return -1;
iic_start();
send_slave_addr(slave_addr|IIC_READ);
if(iic_recv_ack())
return -1;
iic_recv_str(buff,size);
iic_stop();
return size;
}
~~~
應用例子:
~~~
int main()
{
char str[512];
int length = 0;
sys_init(9);
rs232_init(CPU_72M,9600);
rs232_send_byte('\n');
if(-1 == at24c02_write(SLAVE_ADDR,6,__NOTE,strlen(__NOTE)))
rs232_send_str("Write AT24C02 Fail!\n",20);
delay_ms(1000);
if(-1 == (length = at24c02_read(SLAVE_ADDR,0,str,64)))
rs232_send_str("Read AT24C02 Fail!\n",20);
rs232_send_str("Read:",strlen("Read:"));
rs232_send_str(str,strlen(str));
return 0;
}
~~~
- 前言
- 【菜鳥入門】stm32的第一個程序--LED
- 【菜鳥入門】stm32 之 掃描按鍵
- 【菜鳥入門】stm32 之 中斷按鍵
- 【菜鳥入門】stm32 之 USART
- 【菜鳥入門】stm32 之 iic
- 【菜鳥入門】stm32 之 eeprom
- 【菜鳥入門】stm32 之 pwm
- 【菜鳥入門】stm32 之 ADC 模數轉換
- 【菜鳥入門】stm32 之 實時時鐘
- 【菜鳥入門】stm32 之 DMA
- 【菜鳥入門】stm32 之 DAC
- 【STM庫應用】stm32 之 USART
- 中斷源去抖辦法
- stm32 啟動代碼應用技巧
- 【STM庫應用】stm32 之 IIC應用
- 【STM庫應用】stm32 之 中斷按鍵初始化(注意事項)
- 關于結構體初始化
- 【STM庫應用】stm32 之 TIM (詳解一 通用定時器)
- 【STM庫應用】stm32 之 TIM (詳解二 脈沖寬度、周期測量)
- 【stm32庫應用】SD驅動移植(基于SDIO外設)
- SD卡fat文件系統移植
- stm32 DMA初始化選項研究
- stm32 靈活靜態存儲控制器(FSMC)(NORFLASH\PSRAM)
- 【stm32+uC/OS-II】ucosii移植簡單詳細步驟
- STM32 加入調試信息來調試代碼
- NRF24L01 無線通信模塊使用