找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stm8s105k6 寄存器配置IIC问题

[复制链接]
回帖奖励 10 黑币 回复本帖可获得 10 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:243193 发表于 2018-1-18 14:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码一直卡在发送开始位等待总线空闲的循环里了,我都崩溃了。大哥大姐们帮帮我
void IIC_Init(void)
{
  CLK_PCKENR1 |= 0x01;               //使能IIC外设时钟  


  I2C_CR2|=0x80;       //复位总线空闲
  I2C_CR2&=0x7f;       //恢复总线

  I2C_CR1 =0x00;       //禁止iic  

  I2C_FREQR = 0x10;    //输入时钟频率16MHz  
  I2C_TRISER= 0x11;    //0x10 + 1        
  I2C_CCRL  = 0x50;     //16M / 100K / 2                         //  
  I2C_CCRH  = 0x00;                      //标准模式

  I2C_CR1 |= 0x01;                      //使能iic外设  
// I2C_CR2   |= 0x04; //应答使能  

  I2C_OARH = 0x40;                      //七位地址模式  
  I2C_OARL = 0xa0;                      //自身地址0xa0  

}

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

  I2C_CR2|=0x01; //开始信号
  while((I2C_SR1 & 0x01) == 0);     //起始信号已经发送  

  I2C_DR = (DeviceAddress);  // 发送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; //停止信号  
}  


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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