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

2019-07-19 20:19发布

我用两块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));//等待地址发送完成   这里,请各位大牛帮忙分析分析啊!小弟感激不尽!!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
a280573427
1楼-- · 2019-07-19 21:23
 精彩回答 2  元偷偷看……
正点原子
2楼-- · 2019-07-19 23:02
 精彩回答 2  元偷偷看……
我是520老谢
3楼-- · 2019-07-20 04:30
帮顶一个
xdzhang
4楼-- · 2019-07-20 07:43
继续帮顶。
萌新007
5楼-- · 2019-07-20 08:06
 精彩回答 2  元偷偷看……

一周热门 更多>