主时钟频率改变后,iic不能用了,

2019-07-21 04:35发布

/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
// #define SYSCLK_FREQ_24MHz  24000000
// #define SYSCLK_FREQ_36MHz  36000000
// #define SYSCLK_FREQ_48MHz  48000000
//#define SYSCLK_FREQ_56MHz  56000000
#define SYSCLK_FREQ_72MHz  72000000

在主程序中,这样设置72M的话,iic就能正常使用,应答信号等都正常,只要改成36M
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
// #define SYSCLK_FREQ_24MHz  24000000
#define SYSCLK_FREQ_36MHz  36000000
// #define SYSCLK_FREQ_48MHz  48000000
//#define SYSCLK_FREQ_56MHz  56000000
//#define SYSCLK_FREQ_72MHz  72000000

IIC就不能正常运行了,应答信号都不对,请问是什么原因,

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
22条回答
shmilyzgc
1楼-- · 2019-07-22 14:29
操作系统 发表于 2018-3-8 15:05
应该是程序上的原因吧.
与电阻关系不会很大.
IO设置为开漏了没有呀.这是基本要求.

//初始化IIC
void IIC_Init(void)
{                                             
        GPIO_InitTypeDef GPIO_InitStructure;
        //RCC->APB2ENR|=1<<4;//先使能外设IO PORTB时钟
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );       
          
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);                                                  //PE.5 输出高

        IIC_SCL=1;
        IIC_SDA=1;

}
这个是跟原子的例程上一样的
操作系统
2楼-- · 2019-07-22 19:04
本帖最后由 操作系统 于 2018-3-8 15:18 编辑
shmilyzgc 发表于 2018-3-8 15:09
//初始化IIC
void IIC_Init(void)
{                                             

原子哥的程序,不一定是对的呀.不是开漏的 I2C 通用性不强..易出怪问题.
shmilyzgc
3楼-- · 2019-07-23 01:03
操作系统 发表于 2018-3-8 15:13
原子哥的程序,不一定是对的呀.

这个配置应该没问题吧?哪个引脚要开漏?我看到的都是推挽输出
操作系统
4楼-- · 2019-07-23 06:16
 精彩回答 2  元偷偷看……
飞凌单片机
5楼-- · 2019-07-23 09:01
都好厉害
shmilyzgc
6楼-- · 2019-07-23 11:20
操作系统 发表于 2018-3-8 15:22
你查一下STM8S的PDF.所有的型号I2C引脚内置默认开漏结构.
这也是为什么I2C总线的IO口.要求设置开漏的节 ...

也就是说我能直接更改为开漏吗?像这样改?
//初始化IIC
void IIC_Init(void)
{                                             
        GPIO_InitTypeDef GPIO_InitStructure;
        //RCC->APB2ENR|=1<<4;//先使能外设IO PORTB时钟
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );       
          
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
        //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_OD;//开漏输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);                                                  //PE.5 输出高

        IIC_SCL=1;
        IIC_SDA=1;

}

一周热门 更多>