高级会员

- 积分
- 612
- 金钱
- 612
- 注册时间
- 2016-6-7
- 在线时间
- 59 小时
|
2金钱
应该是存储时被优先级高的中断打断了!!!可是要怎么解决这个问题??
引脚时钟已经开启。存储程序是不是有问题?延时10ms会不会太长?但是没有延时肯定更存不住。。。
*******************************************************************************/
void I2C_InitCfg(void)
{
I2C_SCL_H;
I2C_SDA_H;
}
/*******************************************************************************
**Function Name:
**Description : SDA也可以作发送数据,,
*******************************************************************************/
void I2C_SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=I2C_SDA;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
/*******************************************************************************
**Function Name:
**Description : 也可以接收数据
*******************************************************************************/
void I2C_SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=I2C_SDA;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//配置成上拉,如果板子上没有把这两根线上拉的话。
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
/*******************************************************************************
**Function Name:
**Description : 产生起始信号
*******************************************************************************/
void I2C_Start(void)
{
I2C_SDA_OUT();
I2C_SDA_H;
I2C_SCL_H;
delay_us(5);
I2C_SDA_L;
delay_us(6);
I2C_SCL_L;
}
/*******************************************************************************
**Function Name:
**Description : 产生停止信号
*******************************************************************************/
void I2C_Stop(void)
{
I2C_SDA_OUT();
I2C_SCL_L;
I2C_SDA_L;
I2C_SCL_H;
delay_us(6);
I2C_SDA_H;
delay_us(6);
}
/*******************************************************************************
**Function Name:
**Description : 主机产生应答信号ACK
*******************************************************************************/
void I2C_Ack(void)
{
I2C_SCL_L;
I2C_SDA_OUT();
I2C_SDA_L;
delay_us(2);
I2C_SCL_H;
delay_us(5);
I2C_SCL_L;
}
/*******************************************************************************
**Function Name:
**Description : 主机不产生应答信号NACK
*******************************************************************************/
void I2C_NAck(void)
{
I2C_SCL_L;
I2C_SDA_OUT();
I2C_SDA_H;
delay_us(2);
I2C_SCL_H;
delay_us(5);
I2C_SCL_L;
}
/*******************************************************************************
**Function Name:
**Description : 等待从机应答信号?
*******************************************************************************/
u8 I2C_Wait_Ack(void)
{
u8 tempTime=0;
I2C_SDA_IN();
I2C_SDA_H;
delay_us(1);
I2C_SCL_H;
delay_us(1);
while(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA)) //SDA变成低电平的时候,才会给一个应答,如果读到为0说明给反馈信号了。
{
tempTime++; //计数器,如果没有应答不能在这里一直等。
if(tempTime>250)
{
I2C_Stop();
return 1;
}
}
I2C_SCL_L;
return 0;
}
/*******************************************************************************
**Function Name:
**Description : I2C 发送一个字节
*******************************************************************************/
void I2C_Send_Byte(u8 txd)
{
u8 i=0;
I2C_SDA_OUT();
I2C_SCL_L;//拉低时钟开始数据传输
for(i=0;i<8;i++)
{
if((txd&0x80)>0) //0x80 1000 0000 即发送数据时为1就执I2C_SDA_H。否则发个低电平。高位开始先发送
I2C_SDA_H;
else
I2C_SDA_L;
txd<<=1;
I2C_SCL_H;//为高电平时才能真正的发送。
delay_us(2); //发送数据
I2C_SCL_L; //准备下一次发送
delay_us(2);
}
}
void AT24Cxx_WriteTwoByte(u16 addr,u16 dt)
{
I2C_Start();
if(EE_TYPE>AT24C16)
{
I2C_Send_Byte(0xA0);
I2C_Wait_Ack();
I2C_Send_Byte(addr>>8); //发送数据地址高位
}
else
{
I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址+数据地址
}
I2C_Wait_Ack();
I2C_Send_Byte(addr%256);//双字节是数据地址低位
//单字节是数据地址低位
I2C_Wait_Ack();
I2C_Send_Byte(dt>>8);
I2C_Wait_Ack();
I2C_Send_Byte(dt&0xFF);//发低8位这字节数据,发完后就停止。
I2C_Wait_Ack();
I2C_Stop();
delay_ms(10);
}
|
|