OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5849|回复: 5

新人求助:关于两块STM8S103用硬件IIC相互传数据的问题

[复制链接]

4

主题

8

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2016-3-30
在线时间
9 小时
发表于 2016-3-30 12:38:35 | 显示全部楼层 |阅读模式
3金钱
我用两块STM8的硬件IIC进行数据传递实验,一块做主机收数据,一块做从机发数据(就一个字节)。在实验的时候发现,主机程序卡在了“等待地址发送完毕”的阶段,从机也没有收到地址,下面是我的主机和从机的程序,新手写的不好,求大神指教!
主机程序:
#include<iostm8s103f3.h>

short Data=0,clean=0,a=0;

void delay(int ms)               //延时函数
{
  int x,y;
  for(x=ms;x>0;x--)
    for(y=16000;y>0;y--);
}

void Init_I2C(void)
{
  I2C_FREQR = 0x0c;//外设时钟频率2MHZ
  I2C_CR1 |=0x00;//禁止IIC以配置CCR寄存器
  I2C_CCRH = 0x00;   
  I2C_CCRL = 0x37;//通信速度为100KHZ

  I2C_CR1 |=0x01;//启用IIC模块
  I2C_TRISER = 0x0c;//上升时间
  I2C_CR2 |=0x04;//收到一个字节后应答
  I2C_ITR=0x06;//使能缓冲中断和事件中断
  I2C_OARH=0x40;//按要求配置为1
  I2C_OARL=0x02;//设备地址  
}

void WriteAdd_I2C(void)//写地址
{
  while(I2C_SR3 & 0x02);//等待总线空闲
  I2C_CR2 |= 0x01; //产生起始位
  //delay(10);
  while(!(I2C_SR1 & 0x01)); //等待 START 发送完
  I2C_DR = 0xF1; //发送滚轮器件地址,最后一位置1表示读操作
  //delay(10);
  while(!(I2C_SR1 & 0x02));//等待地址发送完成
  clean = I2C_SR1;
  clean = I2C_SR3;//此处通过读SR1和SR2来清空这两个寄存器
}

int main()
{
  asm("sim");//禁止中断
  CLK_CKDIVR=0x00;//使用内部16MHZ频率
  Init_I2C();
  WriteAdd_I2C();
  asm("rim");//开启中断
  while(1);      
}

#pragma vector=21
__interrupt void Master_Int_Device()//读数据
{
  a++;
  Data=I2C_DR;
  delay(10);
  while(I2C_SR1_bit.RXNE==1);//等待收数据寄存器空
  if(I2C_SR2_bit.AF)//应答失败
    {
      I2C_SR2_bit.AF=0;
    }
}



从机程序
#include<iostm8s103f3.h>

short u8_My_Buffer=0x11,clean=0,b=0;   //存储要发送的值

void delay(int ms)               //延时函数
{
  int x,y;
  for(x=ms;x>0;x--)
    for(y=16000;y>0;y--);
}

void Init_I2C (void)
{

  I2C_CR1 =0x81;//关闭时钟延展,启动IIC
  I2C_CR2=0x04;//应答使能
  I2C_FREQR=0x02;//输入时钟频率为标准模式2MHZ
  I2C_OARL=0xF0;//设备地址     
  I2C_OARH=0x40;//该处按要求必须配置为1      
  I2C_ITR=0x06; //使能缓冲中断和事件中断            
}

int main()
{
  asm("sim");//禁止中断
  CLK_CKDIVR=0x00;//使用内部16MHZ频率
  Init_I2C();
  asm("rim");//开启中断
  while(1);   
}
#pragma vector=21
__interrupt void Slave_Int_Device(void)
{

  //u8_My_Buffer=Count;
  while(I2C_SR1_bit.TXE==0);//等待发送数据寄存器空
  I2C_DR=u8_My_Buffer;
  delay(10);
  while(I2C_SR1_bit.BTF==0);//等待字节发送结束
   b++;
  if(I2C_SR2_bit.AF)//应答失败
    {
      I2C_SR2_bit.AF=0;
    }
  clean = I2C_SR1;
  clean = I2C_SR3;
}


运行时主机程序就卡在了  while(!(I2C_SR1 & 0x02));//等待地址发送完成   这里,请各位大牛帮忙分析分析啊!小弟感激不尽!!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

8

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2016-3-30
在线时间
9 小时
 楼主| 发表于 2016-3-30 15:56:35 | 显示全部楼层
怎么没人啊,自顶一个。。。。。。。。
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2016-4-1 23:45:33 | 显示全部楼层
帮顶
回复

使用道具 举报

19

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2015-12-6
在线时间
47 小时
发表于 2017-3-6 10:26:21 | 显示全部楼层
帮顶一个
回复

使用道具 举报

4

主题

144

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
345
金钱
345
注册时间
2017-1-18
在线时间
80 小时
发表于 2017-3-13 22:37:39 | 显示全部楼层
继续帮顶。
回复

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2019-1-14
在线时间
8 小时
发表于 2019-1-14 11:15:02 | 显示全部楼层
帮顶zsdn
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-29 03:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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