搜索
查看: 1122|回复: 2

[求助] 求问STM8L101F3U6TR的硬件IIC从机进不了中断问题

[复制链接]

该用户从未签到

1

主题

2

帖子

0

蝴蝶豆

新手上路

最后登录
2020-12-31
发表于 2020-12-30 10:47:36 | 显示全部楼层 |阅读模式


开发stm8,一直都用的是stvd,但是发现很多例程到使用iar,就转到iar开发。

现在项目上用到IIC从机的问题,也看了挺多人写的硬件IIC从机程序,都运行无问题,于是自己也仿照着写了从机程序
这个程序和他人能用的程序仔细比对过,流程都是一样的(他人用的stm8l不是我用的这个型号,但是这个应该不碍事),选项字节也检查了没有问题

无奈就是不工作,也进不了iic中断。

(IIC硬件接口是PC0 PC1)

贴出初始化代码,还请高人指导一下:

void CLK_init(void)
{
        CLK_DeInit();
        CLK_MasterPrescalerConfig(CLK_MasterPrescaler_HSIDiv1);
        CLK_PeripheralClockConfig(CLK_Peripheral_I2C, ENABLE);
        CLK_PeripheralClockConfig(CLK_Peripheral_SPI, ENABLE);
}



void IIC_init(void)
{
        I2C_DeInit();                                                //占空比1/2                        //使能应答                        //7位地址
        I2C_Init(100000, 0X69, I2C_DutyCycle_2, I2C_Ack_Enable, I2C_AcknowledgedAddress_7bit);                        //标准速度200K,本机地址0X62

        GPIO_Init(GPIOC, GPIO_Pin_0 | GPIO_Pin_1, GPIO_Mode_In_FL_No_IT);       
       
        //开启错误中断、事件中断(如匹配了地址,接收了一字节数据)、BUF中断(接收和发送相关)
        I2C_ITConfig(I2C_IT_ERR | I2C_IT_EVT | I2C_IT_BUF, ENABLE);
        //I2C_ClearFlag(I2C_IT_ERR | I2C_IT_EVT | I2C_IT_BUF);                        //清除一下标志
        enableInterrupts();                                                                                        //开启所有中断
        I2C_Cmd(ENABLE);
}



中断程序在这里(我在中断里面加入了LED取反的操作,已拿掉,但是用主机发送IIC寻址信号,发现并没有进入中断)
INTERRUPT_HANDLER(I2C_IRQHandler, 29)
{
        uint8_t temp = 0;
       
        if(I2C->SR1&0x02)                                                        //地址已经匹配 ADDR标志
        {
                //temp = I2C->SR3&0x07;
                (void)(I2C->SR3);                                                //再读SR3,清除ADDR
               
                if((I2C->SR3)&0x04)                                        //如果是读操作
                {
                        I2C->DR = 0XAA;
                }
        }
        else if((I2C->SR3)&0x04)                        //如果是接收状态
        {
                if((((I2C->SR1)&0x80) == 0X80))
                {
                        //I2C->DR = Test_read[Test_r_pos ];
                        //Test_r_pos ++;
                }
        }
        else if(((I2C->SR1)&0x40)&&(!((I2C->SR3)&0x04)))        //从机接收数据
        {
                temp = I2C->DR;
        }
        else if((I2C->SR1)&0x10)                        //检测到停止位
        {
                //检测到停止位----清除停止位---通过写CR2
                I2C->CR2 = I2C->CR2;
        }
        // 错误管理
        if((I2C->SR2)&0X0F)                                    //IIC出现错误      
        {
                I2C->SR2 &= ~(0X0F);                                 //清零
        }
}



敬请指教!




回复

使用道具 举报

该用户从未签到

1

主题

2

帖子

0

蝴蝶豆

新手上路

最后登录
2020-12-31
 楼主| 发表于 2020-12-30 10:53:41 | 显示全部楼层
注释的内容有些错误,不用看了。

在iar上开发的,现在无奈使用IIc软件从机,没有硬件的好用

而且很奇怪的是,我在使用stvd开发的时候,连定时器中断,外部中断都进不去,感觉这个mcu还是挑编译器的
不知道其他人是否遇到过这种情况
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

1306

帖子

929

蝴蝶豆

版主

最后登录
2021-3-31
发表于 2021-1-1 16:34:39 | 显示全部楼层
官方的软件库中有个例程,可以跑一下,对比一下或者跑通后在上面修改也行
STM8L10x_StdPeriph_Lib_V1.2.0\Project\STM8L10x_StdPeriph_Examples\I2C\I2C_DataExchange\Slave
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-19 11:15 , Processed in 1.148652 second(s), 31 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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