关于IIC读取AT24C02的程序不能优化的问题

2019-07-20 08:54发布

自己做的板子,PB6 接SCL;PB7接SDA;用的IO模拟的方式读取24C02;目前的情况是:
在Keil优化0时读写都正常,
在优化大于0时,只有读正常,写入不正常。
代码基本上是原子的代码,附件是keil5的工程。
请大神帮忙分析一下,该如何修改代码,才能在优化非0的情况下也能写入正常。

多谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
dreong
1楼-- · 2019-07-21 01:00
本帖最后由 dreong 于 2017-4-13 10:15 编辑
正点原子 发表于 2017-4-12 20:52
直接搬我们代码,然后修改下IO口就行了。。。

确确实实是搬得代码,只改了一下IO。因为被这个问题害的出了一次差,所以每句都核对了好几遍。。。就是不行。。。与阿波罗例程不同的仅以下蓝 {MOD}部分改为了红 {MOD}
"myiic.h"中
//IO方向设置
/*
#define SDA_IN()  {GPIOH->MODER&=~(3<<(5*2));GPIOH->MODER|=0<<5*2;}        //PH5输入模式
#define SDA_OUT() {GPIOH->MODER&=~(3<<(5*2));GPIOH->MODER|=1<<5*2;} //PH5输出模式
//IO操作函数         
#define IIC_SCL    PHout(4) //SCL
#define IIC_SDA    PHout(5) //SDA         
#define READ_SDA   PHin(5)  //输入SDA
*/

#define SDA_IN()  {GPIOB->MODER &= ~(3<<(7*2)); GPIOB->MODER |= 0<<(7*2);}        //PB7输入模式
#define SDA_OUT() {GPIOB->MODER &= ~(3<<(7*2)); GPIOB->MODER |= 1<<(7*2);} //PB7输出模式


#define IIC_SCL    PBout(6) //SCL
#define IIC_SDA    PBout(7) //SDA         
#define READ_SDA   PBin(7)  //输入SDA


“myiic.c”中
void IIC_Init(void)
{                                             
//        RCC->AHB1ENR|=1<<7;    //使能PORTH时钟                     
//        GPIO_Set(GPIOH,PIN4|PIN5,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PH4/PH5设置

        RCC->AHB1ENR|=1<<2;    //使能PORTB时钟                     
        GPIO_Set(GPIOB, PIN7, GPIO_MODE_OUT, GPIO_OTYPE_OD, GPIO_SPEED_25M, GPIO_PUPD_NONE);//PB7-SDA
        GPIO_Set(GPIOB, PIN6, GPIO_MODE_OUT, GPIO_OTYPE_PP, GPIO_SPEED_25M, GPIO_PUPD_NONE);//PB6-SCL

        IIC_SCL=1;
        IIC_SDA=1;
}


强调一下,现在的问题是 在优化大于0的情况,仅“写入不行,读24C02在各种优化条件下都没有问题。
我下载过阿波罗的工程,工程里面的优化设置都为0。我用优化0测试,也能通过。一改到优化1就不行。
麻烦哪位有阿波罗板的兄弟改一下优化,然后测试一下,到底有没有我发现的问题。



MeiYüTseng
2楼-- · 2019-07-21 03:23
void IIC_Stop(void)  函数时序有问题,改成如下即可:
void IIC_Stop(void)
{
         SDA_OUT();//sda线输出
        IIC_SCL=1;//0;
         IIC_SDA=0;
         delay_us(4);
        // IIC_SCL=1;
         IIC_SDA=1;//发送I2C总线结束信号
        delay_us(4);
}
掠影
3楼-- · 2019-07-21 03:45
 精彩回答 2  元偷偷看……
Qwertyy
4楼-- · 2019-07-21 05:20
MeiYüTseng 发表于 2017-6-17 10:55
void IIC_Stop(void)  函数时序有问题,改成如下即可:
void IIC_Stop(void)
{

厉害。。。
witlong
5楼-- · 2019-07-21 09:38
 精彩回答 2  元偷偷看……

一周热门 更多>