27,374
社区成员
发帖
与我相关
我的任务
分享
#include "24cxx.h"
/* Write One Byte to AT24CXX */
/* write_addr: 写入地址 */
/* data: 写入数据 */
/* return: 0: 写入成功 */
unsigned char AT24CXX_Write_Byte(unsigned short int write_addr, unsigned char data)
{
IIC_Start();
if(EE_TYPE > AT24C16)
{
IIC_Send_Byte(AT24CXX_ADDR <<1 | IIC_WR);
IIC_Wait_Ack();
IIC_Send_Byte(write_addr>>8);
}
else
IIC_Send_Byte(AT24CXX_ADDR <<1 | IIC_WR);
IIC_Wait_Ack();
IIC_Send_Byte(write_addr%256);
IIC_Wait_Ack();
IIC_Send_Byte(data);
IIC_Wait_Ack();
IIC_Stop();
delay_ms(10); //必须要加,否则写入不了多个数据
return 0;
}
/* Read One Byte from AT24CXX */
/* read_addr: 读取地址 */
/* *data: 读取数据 */
/* return: 0: 读取成功 */
unsigned char AT24CXX_Read_Byte(unsigned short int read_addr, unsigned char *data)
{
IIC_Start();
if(EE_TYPE > AT24C16)
{
IIC_Send_Byte(AT24CXX_ADDR <<1 | IIC_WR);
IIC_Wait_Ack();
IIC_Send_Byte(read_addr >> 8);
}
else
IIC_Send_Byte(AT24CXX_ADDR <<1 | IIC_WR);
IIC_Wait_Ack();
IIC_Send_Byte(read_addr % 256);
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(AT24CXX_ADDR <<1 | IIC_RD);
IIC_Wait_Ack();
*data=IIC_Read_Byte(0);
IIC_Stop();
return 0;
}
/* Write len Byte to AT24CXX */
/* write_addr: 写入地址 */
/* data: 写入数据 */
/* len: 写入字节数 */
/* return: 0: 写入成功 */
unsigned char AT24CXX_Write_LenByte(unsigned short int write_addr, unsigned int data, unsigned char len)
{
unsigned char temp=0;
while(len--)
{
temp=data>>(8*len) & 0xFF;
AT24CXX_Write_Byte(write_addr, temp);
write_addr++;
}
return 0;
}
/* Read len Byte from AT24CXX */
/* read_addr: 读取地址 */
/* *data: 读取数据 */
/* len: 读取字节数 */
/* return: 0: 读取成功 */
unsigned char AT24CXX_Read_LenByte(unsigned short int read_addr, unsigned int *data, unsigned char len)
{
unsigned char temp=0;
*data=0;
while(len--)
{
temp=0;
AT24CXX_Read_Byte(read_addr, &temp);
*data=(*data<<8) + temp;
read_addr++;
}
return 0;
}
/* Write num Data to AT24CXX */
/* write_addr: 写入地址 */
/* *buf: 写入数组 */
/* num: 写入数量 */
/* return: 0: 写入成功 */
unsigned char AT24CXX_Write_nData(unsigned short int write_addr, unsigned char *buf, unsigned char num)
{
while(num--)
{
AT24CXX_Write_Byte(write_addr, *buf);
write_addr++;
buf++;
}
return 0;
}
/* Read num Data from AT24CXX */
/* write_addr: 读取地址 */
/* *buf: 读取数组 */
/* num: 读取数量 */
/* return: 0: 读取成功 */
unsigned char AT24CXX_Read_nData(unsigned short int read_addr, unsigned char *buf, unsigned char num)
{
unsigned char temp;
while(num--)
{
temp=0;
AT24CXX_Read_Byte(read_addr, &temp);
*buf=temp;
read_addr++;
buf++;
}
return 0;
}
/************************ END of the File *************************/
#ifndef _24cxx_H
#define _24cxx_H
#include "includes.h"
#define AT24C01 127
#define AT24C02 255
#define AT24C04 511
#define AT24C08 1023
#define AT24C16 2047
#define AT24C32 4095
#define AT24C64 8191
#define AT24C128 16383
#define AT24C256 32767
#define EE_TYPE AT24C04
#define AT24CXX_ADDR 0x50 // 1010 000x
unsigned char AT24CXX_Write_Byte(unsigned short int write_addr, unsigned char data);
unsigned char AT24CXX_Read_Byte(unsigned short int read_addr, unsigned char *data);
unsigned char AT24CXX_Write_LenByte(unsigned short int write_addr, unsigned int data, unsigned char len);
unsigned char AT24CXX_Read_LenByte(unsigned short int read_addr, unsigned int *data, unsigned char len);
unsigned char AT24CXX_Write_nData(unsigned short int write_addr, unsigned char *buf, unsigned char num);
unsigned char AT24CXX_Read_nData(unsigned short int read_addr, unsigned char *buf, unsigned char num);
#endif
/************************ END of the File *************************/
/*********************** V1.0 - 2016.11.27 ***********************/
//1.支持发送一个字节数据,接收一个字节数据
//2.支持往多个连续地址发送多个数据
//3.支持从多个连续地址读取多个数据
/*********************** V1.1 - 2016.11.30 ***********************/
//4.支持对设备任一可写寄存器中数据任一位进行修改
//5.支持对设备任一可写寄存器中数据多个位进行修改
/************************* END of Record *************************/
#include "iic.h"
/* IIC Init */
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(IIC_RCC , ENABLE); //使能 IIC 时钟
GPIO_InitStructure.GPIO_Pin = IIC_SCL_Pin | IIC_SDA_Pin; //IIC对应IO口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; //管脚推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //管脚频率2MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //管脚上拉
GPIO_Init(IIC_Port , &GPIO_InitStructure); //初始化IIC GPIO
IIC_SCL_H;
IIC_SDA_H;
}
/* IIC Start */
void IIC_Start(void)
{
IIC_SDA_H;
IIC_SCL_H; IIC_delay(); // SDA -- __ __
IIC_SDA_L; IIC_delay(); // SCL -- -- __
IIC_SCL_L; IIC_delay();
}
/* IIC Stop */
void IIC_Stop(void)
{
IIC_SCL_L; IIC_delay();
IIC_SDA_L; IIC_delay(); // SDA __ __ --
IIC_SCL_H; IIC_delay(); // SCL __ -- --
IIC_SDA_H; IIC_delay();
}
/* IIC Send Ack */
void IIC_Ack(void)
{
IIC_SCL_L;
IIC_SDA_L; IIC_delay();
IIC_SCL_H; IIC_delay(); // SDA __ __ __ --
IIC_SCL_L; IIC_delay(); // SCL __ -- __ __
IIC_SDA_H;
}
/* IIC Send NAck */
void IIC_NAck(void)
{
IIC_SCL_L;
IIC_SDA_H; IIC_delay(); // SDA -- -- -- --
IIC_SCL_H; IIC_delay(); // SCL __ -- __ __
IIC_SCL_L; IIC_delay();
IIC_SDA_H;
}
/* IIC Wait a Ack */
/* return: */
/* ack=1 有应答 */
/* ack=0 无应答 */
unsigned char IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
IIC_SCL_L; IIC_delay();
IIC_SDA_H; IIC_delay();
IIC_SCL_H; IIC_delay();
while(IIC_SDA_READ())
{
ucErrTime++;
if(ucErrTime > 50)
{
IIC_Stop();
return 0;
}
}
IIC_SCL_L;
IIC_delay();
return 1;
}
/* IIC Send One Byte */
void IIC_Send_Byte(unsigned char data)
{
unsigned char i;
IIC_SCL_L; IIC_delay();
for(i = 0; i < 8; i++)
{
if(data & 0x80)
{
IIC_SDA_H;
IIC_delay();
}
else
{
IIC_SDA_L;
IIC_delay();
}
IIC_SCL_H; IIC_delay();
IIC_SCL_L; IIC_delay();
data <<= 1;
if(i == 7)
{
IIC_delay();
IIC_SDA_H;
}
}
}
/* IIC Read One Byte */
/* ack=1 发送Ack */
/* ack=0 发送NAck */
unsigned char IIC_Read_Byte(unsigned char ack)
{
unsigned char i;
unsigned char data=0;
for(i = 0; i < 8; i++)
{
data <<= 1;
IIC_SCL_L; IIC_delay();
IIC_SCL_H; IIC_delay();
if(IIC_SDA_READ())
{
data |=0x01;
}
}
IIC_SCL_L;
if(ack == 0)
{
IIC_NAck();
}
else
{
IIC_Ack();
}
return data;
}
/* A simple IIC delay */
static void IIC_delay(void)
{
unsigned char i;
for(i = 0; i < 20; i++); //i>10,才能保证通讯时序
}
/* Write One Data to Register */
/* slaveaddr: 器件地址 */
/* reg_addr: 寄存器地址 */
/* reg_data: 发送的数据 */
unsigned char IIC_Write_Data(unsigned char slaveaddr, unsigned char reg_addr, unsigned char reg_data)
{
IIC_Start();
IIC_Send_Byte(slaveaddr << 1 | IIC_WR);
if(IIC_Wait_Ack() == 0)
{
IIC_Stop();
return 1;
}
IIC_Send_Byte(reg_addr);
IIC_Wait_Ack();
IIC_Send_Byte(reg_data);
IIC_Wait_Ack();
IIC_Stop();
return 0;
}
/* Write n Data to Register */
/* slaveaddr: 器件地址 */
/* reg_addr: 寄存器地址 */
/* num: 数据数量 */
/* reg_data: 发送的数据 */
unsigned char IIC_Write_nData(unsigned char slaveaddr, unsigned char reg_addr, unsigned int num, unsigned char *buf)
{
IIC_Start();
IIC_Send_Byte(slaveaddr << 1 | IIC_WR);
if(IIC_Wait_Ack() == 0)
{
IIC_Stop();
return 1;
}
IIC_Send_Byte(reg_addr);
IIC_Wait_Ack();
while(num--)
{
IIC_Send_Byte(*buf);
IIC_Wait_Ack();
buf++;
}
IIC_Stop();
return 0;
}
/* Read One Data from Register */
/* slaveaddr: 器件地址 */
/* reg_addr: 寄存器地址 */
/* *reg_data: 接收的数据地址 */
unsigned char IIC_Read_Data(unsigned char slaveaddr, unsigned char reg_addr, unsigned char *reg_data)
{
IIC_Start();
IIC_Send_Byte(slaveaddr << 1 | IIC_WR);
if( IIC_Wait_Ack() == 0 )
{
IIC_Stop();
return 1;
}
IIC_Send_Byte(reg_addr);
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(slaveaddr << 1 | IIC_RD);
IIC_Wait_Ack();
*reg_data = IIC_Read_Byte(0);
IIC_Stop();
return 0;
}
/* Read n Data from Register */
/* slaveaddr: 器件地址 */
/* reg_addr: 寄存器地址 */
/* num: 数据数量 */
/* *buf: 接收的数据地址 */
unsigned char IIC_Read_nData(unsigned char slaveaddr, unsigned char reg_addr, unsigned int num, unsigned char *buf)
{
// unsigned int i=0;
IIC_Start();
IIC_Send_Byte(slaveaddr << 1 | IIC_WR);
if( IIC_Wait_Ack() == 0 )
{
IIC_Stop();
return 1;
}
IIC_Send_Byte(reg_addr);
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(slaveaddr << 1 | IIC_RD);
IIC_Wait_Ack();
while(num)
{
if(num == 1)
{
*buf = IIC_Read_Byte(0);
}
else
{
*buf = IIC_Read_Byte(1);
}
buf ++;
num --;
}
// for(i = 0; i < (num -1); i++)
// {
// *buf = IIC_Read_Byte(1);
// buf++;
// }
// *buf = IIC_Read_Byte(0);
IIC_Stop();
return 0;
}
/* Write One Bit Data to REG Data */
/* slaveaddr: 器件地址 */
/* reg_addr: 寄存器地址 */
/* bit_num: 位的序号(第几位) */
/* bit_data: 位的数据(位的状态) */
void IIC_Write_Bit(unsigned char slaveaddr, unsigned char reg_addr, unsigned int bit_num, unsigned char bit_data)
{
unsigned char b;
IIC_Read_Data(slaveaddr, reg_addr, &b);
b=(bit_data != 0) ? (b | (1 << bit_num)) : (b & ~(1 << bit_num));
IIC_Write_Data(slaveaddr, reg_addr, b);
}
/* Write len Bit Data to REG Data */
/* slaveaddr: 器件地址 */
/* reg_addr: 寄存器地址 */
/* bit_start: 开始位的序号(第几位)*/
/* len: 修改位的个数 */
/* bit_data: 位的数据(位的状态) */
void IIC_Write_nBit(unsigned char slaveaddr, unsigned char reg_addr ,unsigned char bit_start,unsigned int len, unsigned char bit_data)
{
unsigned char b,temp;
IIC_Read_Data(slaveaddr, reg_addr, &b);
temp= (0xFF << (bit_start + 1)) | 0xFF >> ((8 - bit_start) + len -1);
bit_data <<= (8 - len);
bit_data >>= (7 - bit_start);
b &=temp;
b |=bit_data;
IIC_Write_Data(slaveaddr, reg_addr, b);
}
/************************ END of the File *************************/
#ifndef _iic_H
#define _iic_H
#include "includes.h"
//Define of the IIC GPIO
#define IIC_RCC RCC_AHB1Periph_GPIOB
#define IIC_Port GPIOB
#define IIC_SCL_Pin GPIO_Pin_10
#define IIC_SDA_Pin GPIO_Pin_11
//Define of the IIC
#define IIC_SCL_H GPIO_SetBits(IIC_Port ,IIC_SCL_Pin)
#define IIC_SCL_L GPIO_ResetBits(IIC_Port ,IIC_SCL_Pin)
#define IIC_SDA_H GPIO_SetBits(IIC_Port ,IIC_SDA_Pin)
#define IIC_SDA_L GPIO_ResetBits(IIC_Port ,IIC_SDA_Pin)
#define IIC_SDA_READ() GPIO_ReadInputDataBit(IIC_Port, IIC_SDA_Pin)
#define IIC_WR 0
#define IIC_RD 1
void IIC_Init(void);
void IIC_Start(void);
void IIC_Stop(void);
void IIC_Ack(void);
void IIC_NAck(void);
unsigned char IIC_Wait_Ack(void);
void IIC_Send_Byte(unsigned char Data);
unsigned char IIC_Read_Byte(unsigned char ack);
static void IIC_delay(void);
unsigned char IIC_Write_Data(unsigned char slaveaddr, unsigned char reg_addr, unsigned char reg_data);
unsigned char IIC_Write_nData(unsigned char slaveaddr, unsigned char reg_addr, unsigned int num, unsigned char *buf);
unsigned char IIC_Read_Data(unsigned char slaveaddr, unsigned char reg_addr, unsigned char *reg_data);
unsigned char IIC_Read_nData(unsigned char slaveaddr, unsigned char reg_addr, unsigned int num, unsigned char *buf);
void IIC_Write_Bit(unsigned char slaveaddr, unsigned char reg_addr, unsigned int bit_num, unsigned char bit_data);
void IIC_Write_nBit(unsigned char slaveaddr, unsigned char reg_addr, unsigned char bit_start,unsigned int len, unsigned char bit_data);
#endif
/************************ END of the File *************************/
放不下,见下一回复