STM32的IIC存儲和讀取整形數據,
下面的程序代碼是使用stm32F03ZET6的I2C1(PB6,PB7)和AT24C02的EEPROM來測試的。希望對於需要的朋友有幫助。
主要代碼如下:
#include "delay.h"
#include "stm32f10x.h"
#include "usart.h"
#include "24cxx.h"
void readNInt(u16 addr,int *buf,int len);
void writeOneInt(u16 addr,int data);
int readOneInt(u16 addr);
void writeNInt(u16 addr,int arr[],int len);
int arr[] = {1222,1223,1224,1225,1226};
int buf[5] = {0};
char j = 0;
int main(void)
{
delay_init(); //延時函數初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組爲組
uart_init(115200); //串口初始化爲115200
AT24CXX_Init(); //IIC初始化
while(AT24CXX_Check())//檢測不到24c02
{
printf("AT24C02 filed\r\n");
}
printf("AT24c02 is ok\r\n");
/*測試向EEPROM中寫入和讀取一個整形數的程序*/
writeOneInt(2,1024);
delay_ms(1000);
printf("read result is %d\r\n",readOneInt(2));
/*測試寫入和讀取N個整形數的測試程序*/
writeNInt(100,arr,5);
delay_ms(1000);
readNInt(100,buf,5);
for(j=0;j<5;j++)
{
printf("%d\t",buf[j]);
}
printf("\r\n");
while(1)
{
}
}
//功能:向EEPROM指定的地址寫一個整形數
//參數:addr:寫入地址
// data:寫入的數據
void writeOneInt(u16 addr,int data)
{
char tmp = 0,i = 0;
for(;i<4;i++)
{
tmp = (char)(data & 0xFF);
AT24CXX_WriteOneByte(addr,tmp);
data = data >> 8;
addr++;
}
}
//功能:在EEPROM中的指定地址讀取一個整形數
//參數:addr:地址
int readOneInt(u16 addr)
{
int tmp = 0;
char i = 0;
for(;i<4;i++)
{
tmp = tmp | (AT24CXX_ReadOneByte(addr) << (i*8)) ;
addr++;
}
return tmp;
}
//功能:向EEPROM指定的地址寫N個整形數
//參數:addr:寫入地址
// arr:要寫入數據所在的緩衝區
// len:寫入的個數
void writeNInt(u16 addr,int *arr,int len)
{
char i = 0;
for(;i<len;i++)
{
writeOneInt(addr,*(arr +i));
addr += 4;
}
}
//功能:向EEPROM指定的地址讀N個整形數
//參數:addr:讀取地址
// arr:讀取數據要保存的緩衝區
// len:讀取的個數
void readNInt(u16 addr,int *buf,int len)
{
char i = 0;
for(;i<len;i++)
{
buf[i] = readOneInt(addr);
addr += 4;
}
}