软件iic测试成功
This commit is contained in:
+72
-8
@@ -9,16 +9,80 @@
|
||||
#include "eeprom.h"
|
||||
#include "iic.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void EEPROM_READ_BATY(uint16_t IN_DEVICE_ADD,char *DATAS,uint16_t LONG)
|
||||
//在AT24CXX指定地址读出一个数据
|
||||
//ReadAddr:开始读数的地址
|
||||
//返回值 :读到的数据
|
||||
uint8_t AT24CXX_ReadOneByte(uint16_t ReadAddr)
|
||||
{
|
||||
IIC_READ_DATE(EEPROM_ADDRESS,IN_DEVICE_ADD,DATAS,LONG);
|
||||
uint8_t temp=0;
|
||||
IIC_Start();
|
||||
if(EE_TYPE>AT24C16)
|
||||
{
|
||||
IIC_Send_Byte(0XA0); //发送写命令
|
||||
IIC_Wait_Ack();
|
||||
IIC_Send_Byte(ReadAddr>>8);//发送高地址
|
||||
IIC_Wait_Ack();
|
||||
}else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据
|
||||
|
||||
IIC_Wait_Ack();
|
||||
IIC_Send_Byte(ReadAddr%256); //发送低地址
|
||||
IIC_Wait_Ack();
|
||||
IIC_Start();
|
||||
IIC_Send_Byte(0XA1); //进入接收模式
|
||||
IIC_Wait_Ack();
|
||||
temp=IIC_Read_Byte(0);
|
||||
IIC_Stop();//产生一个停止条件
|
||||
return temp;
|
||||
}
|
||||
//在AT24CXX指定地址写入一个数据
|
||||
//WriteAddr :写入数据的目的地址
|
||||
//DataToWrite:要写入的数据
|
||||
void AT24CXX_WriteOneByte(uint16_t WriteAddr,uint8_t DataToWrite)
|
||||
{
|
||||
IIC_Start();
|
||||
if(EE_TYPE>AT24C16)
|
||||
{
|
||||
IIC_Send_Byte(0XA0); //发送写命令
|
||||
IIC_Wait_Ack();
|
||||
IIC_Send_Byte(WriteAddr>>8);//发送高地址
|
||||
}else
|
||||
{
|
||||
IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据
|
||||
}
|
||||
IIC_Wait_Ack();
|
||||
IIC_Send_Byte(WriteAddr%256); //发送低地址
|
||||
IIC_Wait_Ack();
|
||||
IIC_Send_Byte(DataToWrite); //发送字节
|
||||
IIC_Wait_Ack();
|
||||
IIC_Stop();//产生一个停止条件
|
||||
|
||||
}
|
||||
|
||||
void EEPROM_WRITE_BATY(uint16_t IN_DEVICE_ADD,char *DATAS,uint16_t LONG)
|
||||
|
||||
//在AT24CXX里面的指定地址开始读出指定个数的数据
|
||||
//ReadAddr :开始读出的地址 对24c02为0~255
|
||||
//pBuffer :数据数组首地址
|
||||
//NumToRead:要读出数据的个数
|
||||
void AT24CXX_Read(uint16_t ReadAddr,uint8_t *pBuffer,uint16_t NumToRead)
|
||||
{
|
||||
IIC_SAND_DATE(EEPROM_ADDRESS,IN_DEVICE_ADD,DATAS,LONG);
|
||||
while(NumToRead)
|
||||
{
|
||||
*pBuffer++=AT24CXX_ReadOneByte(ReadAddr++);
|
||||
NumToRead--;
|
||||
}
|
||||
}
|
||||
//在AT24CXX里面的指定地址开始写入指定个数的数据
|
||||
//WriteAddr :开始写入的地址 对24c02为0~255
|
||||
//pBuffer :数据数组首地址
|
||||
//NumToWrite:要写入数据的个数
|
||||
void AT24CXX_Write(uint16_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite)
|
||||
{
|
||||
while(NumToWrite--)
|
||||
{
|
||||
AT24CXX_WriteOneByte(WriteAddr,*pBuffer);
|
||||
WriteAddr++;
|
||||
pBuffer++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
+19
-2
@@ -12,7 +12,24 @@
|
||||
#define EEPROM_ADDRESS 0xa0
|
||||
|
||||
|
||||
void EEPROM_READ_BATY(uint16_t IN_DEVICE_ADD,char *DATAS,uint16_t LONG);
|
||||
void EEPROM_WRITE_BATY(uint16_t IN_DEVICE_ADD,char *DATAS,uint16_t LONG);
|
||||
#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 AT24C02
|
||||
|
||||
uint8_t AT24CXX_ReadOneByte(uint16_t ReadAddr); //指定地址读取一个字节
|
||||
void AT24CXX_WriteOneByte(uint16_t WriteAddr,uint8_t DataToWrite); //指定地址写入一个字节
|
||||
|
||||
void AT24CXX_Write(uint16_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite); //从指定地址开始写入指定长度的数据
|
||||
void AT24CXX_Read(uint16_t ReadAddr,uint8_t *pBuffer,uint16_t NumToRead); //从指定地址开始读出指定长度的数据
|
||||
|
||||
|
||||
|
||||
#endif /* EEPROM_H_ */
|
||||
|
||||
+115
-88
@@ -11,121 +11,148 @@
|
||||
#define iic_scl(x) HAL_GPIO_WritePin(iic_scl_GPIO_Port, iic_scl_Pin, x)
|
||||
#define read_iic_sda HAL_GPIO_ReadPin(iic_sda_GPIO_Port, iic_sda_Pin)
|
||||
|
||||
#define IIC_SDA_SET iic_sda(1)
|
||||
#define IIC_SCL_SET iic_scl(1)
|
||||
#define IIC_SDA_CLR iic_sda(0)
|
||||
#define IIC_SCL_CLR iic_scl(0)
|
||||
#define SDA_OUT() change_io_function(iic_sda_GPIO_Port, iic_sda_Pin,0)
|
||||
#define SDA_IN() change_io_function(iic_sda_GPIO_Port, iic_sda_Pin,1)
|
||||
#define READ_SDA read_iic_sda
|
||||
|
||||
void iic_start()
|
||||
//产生IIC起始信号
|
||||
void IIC_Start(void)
|
||||
{
|
||||
iic_sda(1);
|
||||
iic_scl(1);
|
||||
iic_sda(0);
|
||||
iic_scl(0);
|
||||
SDA_OUT(); //sda线输出
|
||||
IIC_SDA_SET;
|
||||
IIC_SCL_SET;
|
||||
IIC_SDA_CLR;//START:when CLK is high,DATA change form high to low
|
||||
IIC_SCL_CLR;//钳住I2C总线,准备发送或接收数据
|
||||
}
|
||||
|
||||
void iic_stop()
|
||||
//产生IIC停止信号
|
||||
void IIC_Stop(void)
|
||||
{
|
||||
iic_sda(0);
|
||||
iic_scl(1);
|
||||
iic_sda(1);
|
||||
SDA_OUT();//sda线输出
|
||||
IIC_SCL_CLR;
|
||||
IIC_SDA_CLR;//STOP:when CLK is high DATA change form low to high
|
||||
IIC_SCL_SET;
|
||||
IIC_SDA_SET;//发送I2C总线结束信号
|
||||
}
|
||||
|
||||
void iic_ack()
|
||||
//等待应答信号到来
|
||||
//返回值:1,接收应答失败
|
||||
// 0,接收应答成功
|
||||
uint8_t IIC_Wait_Ack(void)
|
||||
{
|
||||
iic_scl(0);
|
||||
iic_sda(0);
|
||||
iic_scl(1);
|
||||
iic_scl(0);
|
||||
}
|
||||
char iic_wait_ack()
|
||||
{
|
||||
int a=3000;
|
||||
iic_scl(1);
|
||||
iic_sda(1);
|
||||
change_io_function(iic_sda_GPIO_Port, iic_sda_Pin,1);
|
||||
// while(read_iic_sda)
|
||||
// {
|
||||
// a--;
|
||||
// if(a==0)
|
||||
// {
|
||||
// iic_stop();
|
||||
// return 1;
|
||||
// }
|
||||
// }
|
||||
HAL_Delay(1);
|
||||
change_io_function(iic_sda_GPIO_Port, iic_sda_Pin,0);
|
||||
uint8_t ucErrTime=0;
|
||||
SDA_IN(); //SDA设置为输入
|
||||
IIC_SDA_SET;
|
||||
IIC_SCL_SET;
|
||||
while(READ_SDA)
|
||||
{
|
||||
ucErrTime++;
|
||||
if(ucErrTime>250)
|
||||
{
|
||||
IIC_Stop();
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
IIC_SCL_CLR;//时钟输出0
|
||||
return 0;
|
||||
}
|
||||
|
||||
void IIC_Write_Byte(unsigned char IIC_Byte)
|
||||
//产生ACK应答
|
||||
void IIC_Ack(void)
|
||||
{
|
||||
iic_scl(0);
|
||||
for(unsigned char i=0;i<8;i++)
|
||||
{
|
||||
if(IIC_Byte & 0x80)
|
||||
{
|
||||
iic_sda(1);
|
||||
}else
|
||||
{
|
||||
iic_sda(0);
|
||||
}
|
||||
IIC_Byte<<=1;
|
||||
iic_scl(1);
|
||||
iic_scl(0);
|
||||
}
|
||||
IIC_SCL_CLR;
|
||||
SDA_OUT();
|
||||
IIC_SDA_CLR;
|
||||
IIC_SCL_SET;
|
||||
IIC_SCL_CLR;
|
||||
}
|
||||
|
||||
unsigned char IIC_Read_Byte()
|
||||
//不产生ACK应答
|
||||
void IIC_NAck(void)
|
||||
{
|
||||
unsigned char k=0;
|
||||
iic_scl(0);
|
||||
iic_sda(1);
|
||||
change_io_function(iic_sda_GPIO_Port, iic_sda_Pin,1);
|
||||
for(unsigned char i=0; i<8; i++)
|
||||
{
|
||||
iic_scl(1);
|
||||
k<<=1;
|
||||
if(read_iic_sda==1)
|
||||
{
|
||||
k|=0x01;
|
||||
}
|
||||
|
||||
iic_scl(0);
|
||||
}
|
||||
change_io_function(iic_sda_GPIO_Port, iic_sda_Pin,0);
|
||||
return(k);
|
||||
IIC_SCL_CLR;
|
||||
SDA_OUT();
|
||||
IIC_SDA_SET;
|
||||
IIC_SCL_SET;
|
||||
IIC_SCL_CLR;
|
||||
}
|
||||
//IIC发送一个字节
|
||||
//返回从机有无应答
|
||||
//1,有应答
|
||||
//0,无应答
|
||||
void IIC_Send_Byte(uint8_t txd)
|
||||
{
|
||||
uint8_t t;
|
||||
SDA_OUT();
|
||||
IIC_SCL_CLR;//拉低时钟开始数据传输
|
||||
for(t=0;t<8;t++)
|
||||
{
|
||||
//IIC_SDA=(txd&0x80)>>7;
|
||||
if((txd&0x80)>>7)
|
||||
IIC_SDA_SET;
|
||||
else
|
||||
IIC_SDA_CLR;
|
||||
txd<<=1;
|
||||
|
||||
IIC_SCL_SET;
|
||||
|
||||
IIC_SCL_CLR;
|
||||
|
||||
}
|
||||
}
|
||||
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
|
||||
uint8_t IIC_Read_Byte(unsigned char ack)
|
||||
{
|
||||
unsigned char i,receive=0;
|
||||
SDA_IN();//SDA设置为输入
|
||||
for(i=0;i<8;i++ )
|
||||
{
|
||||
IIC_SCL_CLR;
|
||||
|
||||
IIC_SCL_SET;
|
||||
receive<<=1;
|
||||
if(READ_SDA)receive++;
|
||||
|
||||
}
|
||||
if (!ack)
|
||||
IIC_NAck();//发送nACK
|
||||
else
|
||||
IIC_Ack(); //发送ACK
|
||||
return receive;
|
||||
}
|
||||
|
||||
void IIC_SAND_DATE(unsigned char DEVICE_ADD,unsigned char IN_DEVICE_ADD,char *DATAS,uint16_t LONG)
|
||||
{
|
||||
iic_start();
|
||||
IIC_Write_Byte(DEVICE_ADD);
|
||||
if(iic_wait_ack()){return;}
|
||||
IIC_Write_Byte(IN_DEVICE_ADD);
|
||||
if(iic_wait_ack()){return;}
|
||||
IIC_Start();
|
||||
IIC_Send_Byte(DEVICE_ADD);
|
||||
if(IIC_Wait_Ack()){return;}
|
||||
IIC_Send_Byte(IN_DEVICE_ADD);
|
||||
if(IIC_Wait_Ack()){return;}
|
||||
for(int a=0;a<LONG;a++)
|
||||
{
|
||||
IIC_Write_Byte(*DATAS);
|
||||
IIC_Send_Byte(*DATAS);
|
||||
DATAS++;
|
||||
|
||||
}
|
||||
if(iic_wait_ack()){return;}
|
||||
iic_stop();
|
||||
if(IIC_Wait_Ack()){return;}
|
||||
IIC_Stop();
|
||||
}
|
||||
|
||||
void IIC_READ_DATE(unsigned char DEVICE_ADD,unsigned char IN_DEVICE_ADD,char *DATAS,uint16_t LONG)
|
||||
{
|
||||
iic_start();
|
||||
IIC_Write_Byte(DEVICE_ADD);
|
||||
if(iic_wait_ack()){return;}
|
||||
IIC_Write_Byte(IN_DEVICE_ADD);
|
||||
if(iic_wait_ack()){return;}
|
||||
iic_start();
|
||||
IIC_Write_Byte(DEVICE_ADD+1);
|
||||
if(iic_wait_ack()){return;}
|
||||
IIC_Start();
|
||||
IIC_Send_Byte(DEVICE_ADD);
|
||||
if(IIC_Wait_Ack()){return;}
|
||||
IIC_Send_Byte(IN_DEVICE_ADD);
|
||||
if(IIC_Wait_Ack()){return;}
|
||||
IIC_Start();
|
||||
IIC_Send_Byte(DEVICE_ADD+1);
|
||||
if(IIC_Wait_Ack()){return;}
|
||||
for(int a=0;a<LONG;a++)
|
||||
{
|
||||
*DATAS=IIC_Read_Byte();
|
||||
*DATAS=IIC_Read_Byte(0);
|
||||
DATAS++;
|
||||
}
|
||||
if(iic_wait_ack()){return;}
|
||||
iic_stop();
|
||||
if(IIC_Wait_Ack()){return;}
|
||||
IIC_Stop();
|
||||
}
|
||||
|
||||
@@ -9,7 +9,29 @@
|
||||
#define IIC_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
//产生IIC起始信号
|
||||
void IIC_Start(void);
|
||||
//产生IIC停止信号
|
||||
void IIC_Stop(void);
|
||||
//等待应答信号到来
|
||||
//返回值:1,接收应答失败
|
||||
// 0,接收应答成功
|
||||
uint8_t IIC_Wait_Ack(void);
|
||||
//产生ACK应答
|
||||
void IIC_Ack(void);
|
||||
//不产生ACK应答
|
||||
void IIC_NAck(void);
|
||||
//IIC发送一个字节
|
||||
//返回从机有无应答
|
||||
//1,有应答
|
||||
//0,无应答
|
||||
void IIC_Send_Byte(uint8_t txd);
|
||||
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
|
||||
uint8_t IIC_Read_Byte(unsigned char ack);
|
||||
|
||||
void IIC_SAND_DATE(unsigned char DEVICE_ADD,unsigned char IN_DEVICE_ADD,char *DATAS,uint16_t LONG);
|
||||
|
||||
void IIC_READ_DATE(unsigned char DEVICE_ADD,unsigned char IN_DEVICE_ADD,char *DATAS,uint16_t LONG);
|
||||
|
||||
#endif /* IIC_H_ */
|
||||
|
||||
@@ -265,9 +265,9 @@ void my_code()
|
||||
r480_init();
|
||||
|
||||
config.begin=18;
|
||||
EEPROM_WRITE_BATY(8,(char *)&config,sizeof(config_setting));
|
||||
AT24CXX_Write(8,(char *)&config,sizeof(config_setting));
|
||||
config.begin=1;
|
||||
EEPROM_READ_BATY(8,(char *)&config,sizeof(config_setting));
|
||||
AT24CXX_Read(8,(char *)&config,sizeof(config_setting));
|
||||
|
||||
|
||||
while(1)
|
||||
|
||||
Reference in New Issue
Block a user