初级会员

- 积分
- 83
- 金钱
- 83
- 注册时间
- 2014-3-16
- 在线时间
- 4 小时
|
这是程序的main函数
int main(void)
{
uint8_t temp=5;
Init_IIC();
// IIC_Read(0xA1,2,sizeof(uint8_t),1,&temp);
temp++;
IIC_Write(0xA0,2,sizeof(uint8_t),1,&temp);
while(1)
{
display(temp); //数码管显示
}
}

把这一个读的函数注释掉能正常显示,但如果不注释的话不能显示;
我以为是读函数的问题,
但我要是吧写的那个注释掉,读的那个不注释,又能正常显示了
TWI读写函数完整是这样的
unsigned char IIC_Read(unsigned char device_addr,unsigned char word_addr,unsigned char type_size,unsigned char len,void *user_buf)
{
//Start
IIC_Start(); //硬件发送START信号,并且清零TWINT位,使能硬件IIC,使IIC开始工作
IIC_Wait(); //等待 发送START完成 TWINT位置位
if ((TWSR & 0xF8) != TW_START) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量,如果正确则向下进行数据传输,错误返回 0
//SLA+W
TWDR = device_addr&0xFE ; //芯片地址,赋值给数据寄存器 TWDR ,等待发送
TWCR = (1 << TWINT) | (1 << TWEN); //对控制寄存器TWCR的 TWINT 位软件写1进行清零,然后 使能IIC硬件接口 ,让IIC进行工作,发送 TWDR寄存器 中的数据
IIC_Wait(); //等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != TW_MT_SLA_ACK) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0
//WORD ADDRESS
TWDR = word_addr; //将写入数据的绝对地址 ,赋值给数据寄存器 TWDR ,等待发送
TWCR = (1 << TWINT) | (1 << TWEN); //对控制寄存器TWCR的 TWINT 位软件写1进行清零,然后 使能IIC硬件接口 ,让IIC进行工作,发送 TWDR寄存器 中的数据
IIC_Wait(); //等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != TW_MT_DATA_ACK) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0
//REPEATED START
IIC_Start(); //硬件发送START信号,并且清零TWINT位,使能硬件IIC,使IIC开始工作
IIC_Wait(); //等待 发送START完成 TWINT位置位
if ((TWSR & 0xF8) != TW_REP_START ) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量,如果正确则向下进行数据传输,错误返回 0
//SLA+R
TWDR = device_addr| 0x01; //芯片地址,赋值给数据寄存器 TWDR ,等待发送
TWCR = (1 << TWINT) | (1 << TWEN); //对控制寄存器TWCR的 TWINT 位软件写1进行清零,然后 使能IIC硬件接口 ,让IIC进行工作,发送 TWDR寄存器 中的数据
IIC_Wait(); //等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != TW_MR_SLA_ACK) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0
//Read Data
len = len*type_size;
while(len--)
{
if(len == 1)
{
TWCR = (1 << TWINT) | (1 << TWEN); //不使能应答
}
else
{
TWCR = (1 << TWINT) | (1 << TWEN)| (1 << TWEA); //使能应答
}
IIC_Wait(); //等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != TW_MR_DATA_ACK) return 0; //检测到TWINT位置
*(unsigned char*)user_buf++=TWDR;
}
IIC_Stop();
IIC_Stop(); //数据传输完成,发送STOP信号,释放对总线的控制
return 1; //写入数据成功 ,返回1 ,用来判断是否成功写入数据
}
unsigned char IIC_Write(unsigned char device_addr,unsigned char word_addr,unsigned char type_size,unsigned char len,void *user_buf)
{
// unsigned char *p=(unsigned char *)user_buf;
//Start
IIC_Start(); //硬件发送START信号,并且清零TWINT位,使能硬件IIC,使IIC开始工作
IIC_Wait(); //等待 发送START完成 TWINT位置位
if ((TWSR & 0xF8) != TW_START) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量,如果正确则向下进行数据传输,错误返回 0
//SLA+W
TWDR = device_addr&0xFE ; //芯片地址,赋值给数据寄存器 TWDR ,等待发送
TWCR = (1 << TWINT) | (1 << TWEN); //对控制寄存器TWCR的 TWINT 位软件写1进行清零,然后 使能IIC硬件接口 ,让IIC进行工作,发送 TWDR寄存器 中的数据
IIC_Wait(); //等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != TW_MT_SLA_ACK) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0
//WORD ADDRESS
TWDR = word_addr; //将写入数据的绝对地址 ,赋值给数据寄存器 TWDR ,等待发送
TWCR = (1 << TWINT) | (1 << TWEN); //对控制寄存器TWCR的 TWINT 位软件写1进行清零,然后 使能IIC硬件接口 ,让IIC进行工作,发送 TWDR寄存器 中的数据
IIC_Wait(); //等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != TW_MT_DATA_ACK) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0
len = len*type_size;
while(len--)
{
TWDR = *(unsigned char *)user_buf++; //将要写入的数据 ,赋值给数据寄存器 TWDR ,等待发送
TWCR = (1 << TWINT) | (1 << TWEN); //对控制寄存器TWCR的 TWINT 位软件写1进行清零,然后 使能IIC硬件接口 ,让IIC进行工作,发送 TWDR寄存器 中的数据
IIC_Wait(); //等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != TW_MT_DATA_ACK)return 0;
}
//*/
IIC_Stop(); //数据传输完成,发送STOP信号,释放对总线的控制
return 1; //写入数据成功 ,返回1 ,用来判断是否成功写入数据
}
|
|