我用两块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));//等待地址发送完成 这里,请各位大牛帮忙分析分析啊!小弟感激不尽!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>