找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1331|回复: 0
打印 上一主题 下一主题
收起左侧

stm8s105k6 寄存器版IIC通信问题

[复制链接]
跳转到指定楼层
楼主
ID:243193 发表于 2018-1-17 11:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码无法通信,不知道是什么问题,这些配置也是按照网上的例程来的

void IIC_Init(void)
{
  CLK_PCKENR1 |= 0x01;               //使能IIC外设时钟   
  //PB_DDR &= 0xcf;  
// PB_CR1 &= 0xcf;  
  //PB_CR2 &= 0xcf;  

  I2C_CR1 = 0x00;                       //允许时钟延展,禁止广播呼叫,禁止iic  
  I2C_FREQR = 0x10;                     //输入时钟频率16MHz  
  I2C_OARH = 0x40;                      //七位地址模式  
  I2C_OARL = 0xa0;                      //自身地址0xa0  
  I2C_CCRL = 0x50; //16M / 100K / 2     // I2C_CCRL = 0xff;                      //  
  I2C_CCRH = 0x00;                      //标准模式  
  I2C_TRISER = 0x11; //0x10 + 1         //I2C_TRISER = 0x02;  
// I2C_CR2   |= 0x04; //应答使能  
  I2C_CR1 |= 0x01;                      //使能iic外设  
}

void IIC_Write_Byte(u8 DeviceAddress,  u8 Data)  //器件地址,和发送的指令
{  
  u8 temp = 0;  
  while((I2C_SR3 & 0x02) != 0);     //等待IIC总线空闲  

  I2C_CR2|=0x01;//IIC_Start();
  while((I2C_SR1 & 0x01) == 0);     //EV5,起始信号已经发送  
  I2C_DR = (DeviceAddress & 0xfe);  // 发送iic从器件物理地址,最低位0,写操作  
  while((I2C_SR1 & 0x02) == 0);     //地址已经被发送  
  temp = I2C_SR1;                   //清除ADDR标志位  
  temp = I2C_SR3;
  while((I2C_SR1 & 0x80) == 0);     //等待发送寄存器为空  

  I2C_DR = Data;                      //发送要写入的数据  
  while((I2C_SR1 & 0x04) == 0);       //等待发送完成  
  temp = I2C_SR1;                     //清零BTF标志位  
  temp = I2C_DR;  
  I2C_CR2|=0x02;                        //发送停止信号  
}  

void IIC_Read_Byte(u8 DeviceAddress,u8 buf0,u8 buf1,u8 buf2,u8 buf3)  //发送器件地址及其读方向  
{  
  u8  temp = 0;  
  while((I2C_SR3 & 0x02) != 0);     //等待IIC总线空闲  

  I2C_CR2 |= 0x04;                  //使能ACK  
  I2C_CR2|=0x01;                    //IIC_Start();

  while((I2C_SR1 & 0x01) == 0);     //EV5,起始信号已经发送  
  I2C_DR = (DeviceAddress | 0x01);  // 发送iic从器件物理地址,最低位1,读操作  
  while((I2C_SR1 & 0x02) == 0);     //地址已经被发送  
  temp = I2C_SR1;                   //清除ADDR标志位  
  temp = I2C_SR3;  

  while((I2C_SR1 & 0x40) == 0);     //等待接收数据寄存器非空  
  buf0 = I2C_DR;  


  while((I2C_SR1 & 0x40) == 0);     //等待接收数据寄存器非空  
  buf1 = I2C_DR;


  while((I2C_SR1 & 0x40) == 0);     //等待接收数据寄存器非空  
  buf2 = I2C_DR;


  while((I2C_SR1 & 0x40) == 0);     //等待接收数据寄存器非空  
  buf3 = I2C_DR;

  I2C_CR2 &= 0xfb;          //发送stop必须禁止ack,才能释放从机  
  temp = I2C_SR1;           //清零BTF标志位  
  temp = I2C_DR;  
  I2C_CR2|=0x02;  //停止信号
}  


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表