stm32读取eeprom问题

[复制链接]
查看11 | 回复9 | 2021-1-27 06:20:34 | 显示全部楼层 |阅读模式
用的是stm32f103c8t6自己做的板然后的话用的软件IIC读取at24c64读出来都是0xFF找了一天不知道什么原因


代码附在如下
#include"eep_at24.h"
//SDA设置输出模式
staticvoidSDA_OUT(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_11);
}
//SDA设置输入模式
staticvoidSDA_IN(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_11);
}

//初始化IIC
voidIIC_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOB时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_11;
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_10|GPIO_Pin_11);//PB6,PB7输出高
}
//产生IIC起始信号
voidIIC_Start(void)
{
SDA_OUT();//sda线输出
IIC_SDA1;
IIC_SCL1;
delay_us(5);
IIC_SDA0;//START:whenCLKishigh,DATAchangeformhightolow
delay_us(5);
IIC_SCL0;//钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
voidIIC_Stop(void)
{
SDA_OUT();//sda线输出
IIC_SCL0;
IIC_SDA0;//STOP:whenCLKishighDATAchangeformlowtohigh
delay_us(5);
IIC_SCL1;
delay_us(5);
IIC_SDA1;//发送I2C总线结束信号
delay_us(5);
}
//等待应答信号到来
//返回值:1,接收应答失败
//0,接收应答成功
u8IIC_Wait_Ack(void)
{
u8ucErrTime=0;
SDA_IN();//SDA设置为输入
IIC_SDA1;
delay_us(5);
IIC_SCL1;
delay_us(5);
while(Read_IIC_SDA())
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return1;
}
}
IIC_SCL0;//时钟输出0
return0;
}
//产生ACK应答
voidIIC_Ack(void)
{
IIC_SCL0;
SDA_OUT();
IIC_SDA0;
delay_us(5);
IIC_SCL1;
delay_us(5);
IIC_SCL0;
}
//不产生ACK应答
voidIIC_NAck(void)
{
IIC_SCL0;
SDA_OUT();
IIC_SDA1;
delay_us(5);
IIC_SCL1;
delay_us(5);
IIC_SCL0;
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
voidIIC_Send_Byte(u8txd)
{
u8t;
SDA_OUT();
IIC_SCL0;//拉低时钟开始数据传输
for(t=0;t>7;
if((txd&0x80)>>7)
IIC_SDA1
else
IIC_SDA0
txdAT24C16)
{
IIC_Send_Byte(0XA0);//发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr>>8);//发送高地址
//IIC_Wait_Ack();
}elseIIC_Send_Byte(0XA0+((ReadAddr/256)AT24C16)
{
IIC_Send_Byte(0XA0);//发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr>>8);//发送高地址
}else
{
IIC_Send_Byte(0XA0+((WriteAddr/256)>(8*t))&0xff);
}
}
//在AT24CXX里面的指定地址开始读出长度为Len的数据
//该函数用于读出16bit或者32bit的数据.
//ReadAddr:开始读出的地址
//返回值:数据
//Len:要读出数据的长度2,4
u32AT24CXX_ReadLenByte(u16ReadAddr,u8Len)
{
u8t;
u32temp=0;
for(t=0;t -->
回复

使用道具 举报

千问 | 2021-1-27 06:20:34 | 显示全部楼层



回复

使用道具 举报

千问 | 2021-1-27 06:20:34 | 显示全部楼层
intsum=0,count;
//u8I2c_Buf_Write[20]={'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'};
//u8I2c_Buf_Read[16]={'0','6','0','4','0','1','0','0','1','1','0','0','0','0','0'};
uint8_tI2c_Buf_Read[16]={1,6,0,4,0,1,0,0,1,1,0,0,0,0,0};
uint8_tI2c_Buf_Write[16]={8,8,8,8,8,8,8,8,8,8,8,8,8,8,8};
uint8_tmynum;
longintForceValue1=0x000,ForceValue2=0x000,ForceValue3=0x000;//测量值存放在此

CanRxMsgCAN_Rece_Data;//CAN通信参数
CanTxMsgCAN_Tran_Data;//CAN通信参数
uint8_tflag=0;//CAN通信参数


voidSetParameter1(void);//上电读取EEPROM参数配置ADS

intmain(void)
{

rcc_init();//配置系统时钟频率为72MHzAPB272MhzAPB132Mhz
//pwm_init();
//I2C_GPIOInitConfig();//暂时不使用
//ADC1_Init();
SPI_ADS_Init();//ADS1初始化
SPI_ADS_Init2();//ADS2初始化
//SPI_ADS_Init3();//ADS3初始化
CAN_Config();//CAN模块初始化
AT24CXX_Init();//EEPROM初始化
//SetParameter1();//上电自动读取EEPROM参数并设置ADS寄存器
inti=0,j=0;

CAN_Tran_Data.StdId=0;
CAN_Tran_Data.ExtId=PASS_ID;
CAN_Tran_Data.RTR=CAN_RTR_Data;
CAN_Tran_Data.IDE=CAN_Id_Extended;
CAN_Tran_Data.DLC=1;
//CAN_Tran_Data.Data[0]=I2c_Buf_Read[3];
//CAN_Transmit(CAN1,&CAN_Tran_Data);
delay_ms(50);
//CAN_Tran_Data.Data[0]=I2c_Buf_Write[3];
//CAN_Transmit(CAN1,&CAN_Tran_Data);
//
AT24CXX_Write(0x00,I2c_Buf_Read,11);
delay_ms(50);
AT24CXX_Read(0x00,I2c_Buf_Write,11);

回复

使用道具 举报

千问 | 2021-1-27 06:20:34 | 显示全部楼层
https://blog.csdn.net/zxh1592000/article/details/78732129


回复

使用道具 举报

千问 | 2021-1-27 06:20:34 | 显示全部楼层
难受啊马飞
回复

使用道具 举报

千问 | 2021-1-27 06:20:34 | 显示全部楼层
我也遇到过。每个节读写后的延时有问题;至少10ms,需要忙延时。可以参考日志https://blog.csdn.net/ggggyj/article/details/84098957
回复

使用道具 举报

千问 | 2021-1-27 06:20:34 | 显示全部楼层
GPIO_Mode_Out_PP;//推挽输出??
IIC你得用OD呀
I2CpinoutConfigurationGPIOconfiguration
I2Cx_SCLI2CclockAlternatefunctionopendrain
I2Cx_SDAI2CDataI/OAlternatefunctionopendrain
回复

使用道具 举报

千问 | 2021-1-27 06:20:34 | 显示全部楼层
引用7楼失散糖的回复:GPIO_Mode_Out_PP;//推挽输出??
IIC你得用OD呀
I2CpinoutConfigurationGPIOconfiguration
I2Cx_SCLI2CclockAlternatefunctionopendrain
I2Cx_SDAI2CDataI/OAlternatefunctionopendrain


我成推挽输出读了24C02没问题后面改了开漏效果也一样呀
回复

使用道具 举报

千问 | 2021-1-27 06:20:34 | 显示全部楼层
引用6楼诺水城子的回复:我也遇到过。每个节读写后的延时有问题;至少10ms,需要忙延时。可以参考日志https://blog.csdn.net/ggggyj/article/details/84098957
我也加了延时。。。我后面都加到五十了还是没的效果
回复

使用道具 举报

千问 | 2021-1-27 06:20:34 | 显示全部楼层
AT24CXX_WriteOneByte函数的这两处
IIC_Send_Byte(0XA0);//发送写命令
elseIIC_Send_Byte(0XA0+((ReadAddr/256)<<1));//发送器件地址0XA0,写数据
发送的器件地址0xA0都改为0xA1试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行