历史上的今天
返回首页

历史上的今天

今天是:2025年08月09日(星期六)

2019年08月09日 | stm32 I2C自收发测试例程

2019-08-09 来源:eefocus

define BufferSize 4

define I2C2_SLAVE_ADDRESS7 0x30

/* Private macro ————————————————————-*/ 

/* Private variables ———————————————————*/


vu8 I2C1_Buffer_Tx[BufferSize] = {1, 2, 3, 4}; /* I2C1待发送字节数组 */ 

vu8 I2C2_Buffer_Rx[BufferSize] = {0, 0, 0, 0}; /* I2C2待接收字节缓冲 */ 

vu8 Tx_Idx = 0; /* I2C1数据发送计数变量 */ 

vu8 Rx_Idx = 0; /* I2C2数据接收计数变量 */


/* 自定义参数宏 ——————————————————-*/


define I2C1_SLAVE_ADDRESS7 0x30 /* 定义 I2C1 本地地址为0x30 */

define I2C2_SLAVE_ADDRESS7 0x30 /* 定义 I2C2 本地地址为0x30 */

define BufferSize 4

/* 自定义函数宏 ——————————————————-*/


/* 自定义变量 ——————————————————-*/


/* 用户函数声明 ———————————————————*/


void RCC_Configuration(void); 

void GPIO_Configuration(void); 

void NVIC_Configuration(void); 

void USART_Configuration(void); 

void I2c_Configuration(void);


int main(void) 

/* 设置系统时钟 */ 

RCC_Configuration(); 

/* 设置 NVIC */ 

NVIC_Configuration(); 

/* 设置GPIO端口 */ 

GPIO_Configuration(); 

/* 设置USART */ 

USART_Configuration(); 

/* 设置 IIC */ 

I2c_Configuration();


/* I2C1产生开始条件 */

I2C_GenerateSTART(I2C1, ENABLE);


while(1);

1

2

3

4

}


void RCC_Configuration(void) 

ErrorStatus HSEStartUpStatus;


RCC_DeInit();

RCC_HSEConfig(RCC_HSE_ON);

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus == SUCCESS)

{

    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    FLASH_SetLatency(FLASH_Latency_2);

    RCC_HCLKConfig(RCC_SYSCLK_Div1); 

    RCC_PCLK2Config(RCC_HCLK_Div1); 

    RCC_PCLK1Config(RCC_HCLK_Div2);

    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);    

    RCC_PLLCmd(ENABLE);

    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    while(RCC_GetSYSCLKSource() != 0x08);

}


/* 开启 I2C1、I2C2 设备时钟 */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1 | RCC_APB1Periph_I2C2, ENABLE);

/* 开启 GPIOA、GPIOB和 USART 设备时钟 */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

}


void GPIO_Configuration(void) 

/* 定义 GPIO 初始化结构体 GPIO_InitStructure */ 

GPIO_InitTypeDef GPIO_InitStructure;


/* 配置 I2C1 设备的引脚为复用开漏模式 */

GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;

GPIO_Init(GPIOB, &GPIO_InitStructure);


/* 配置 I2C2 设备的引脚为复用开漏模式 */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;

GPIO_Init(GPIOB, &GPIO_InitStructure);


/* 配置 USART 设备引脚 */ 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

}


void I2c_Configuration(void) 

/* 定义 I2C 初始化结构体 I2C_InitStructure */ 

I2C_InitTypeDef I2C_InitStructure;


/*  

*   I2C模式;

*   占空比50%;

*   本地地址(前面宏定义定义为0x30)

*   使能应答;

*   应答7位地址;

*   速率200K;

*/

I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;//设置I2C接口为I2C模式

I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;  //设置占空比为2/1

I2C_InitStructure.I2C_OwnAddress1 = I2C1_SLAVE_ADDRESS7;     //设置第一个设备自身地址可以是7位也可以是10位

I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;//使能ACk应答

I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; //设置应答7位地址

I2C_InitStructure.I2C_ClockSpeed = 200000;  //

I2C_Init(I2C1, &I2C_InitStructure);


I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;

I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;

I2C_InitStructure.I2C_OwnAddress1 = I2C2_SLAVE_ADDRESS7;

I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;

I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;

I2C_InitStructure.I2C_ClockSpeed = 200000;

I2C_Init(I2C2, &I2C_InitStructure);


/* 开启I2C1、I2C2 的事件、缓存中断 */

I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_BUF, ENABLE);

I2C_ITConfig(I2C2, I2C_IT_EVT | I2C_IT_BUF, ENABLE);


/* 使能I2C1、I2C2 接口 */

I2C_Cmd(I2C1, ENABLE);

I2C_Cmd(I2C2, ENABLE);

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

}


void NVIC_Configuration(void) 

/* 定义 NVIC 初始化结构体 NVIC_InitStructure */ 

NVIC_InitTypeDef NVIC_InitStructure;


/* 选择 NVIC 优先级分组1 */

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);


/* 设置并使能 I2C1 中断 */

NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);


/* 设置并使能 I2C2 中断 */  

NVIC_InitStructure.NVIC_IRQChannel = I2C2_EV_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

}


void USART_Configuration(void) 

/* 定义USART初始化结构体 USART_InitStructure */ 

USART_InitTypeDef USART_InitStructure; 

/* 定义USART初始化结构体 USART_ClockInitStructure */ 

USART_ClockInitTypeDef USART_ClockInitStructure;


/*  

*   波特率为115200bps;

*   8位数据长度;

*   1个停止位,无校验;

*   禁用硬件流控制;

*   禁止USART时钟;

*   时钟极性低;

*   在第2个边沿捕获数据

*   最后一位数据的时钟脉冲不从 SCLK 输出; 

*/

USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;

USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;

USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;

USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;

USART_ClockInit(USART1 , &USART_ClockInitStructure);


USART_InitStructure.USART_BaudRate = 115200;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

USART_InitStructure.USART_StopBits = USART_StopBits_1;

USART_InitStructure.USART_Parity = USART_Parity_No ;

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_Init(USART1 , &USART_InitStructure);


/* 使能USART1 */

USART_Cmd(USART1 , ENABLE);

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

}


void I2C1_EV_IRQHandler(void) 

switch (I2C_GetLastEvent(I2C1)) 

case I2C_EVENT_MASTER_MODE_SELECT: /* 已发送起始条件 */ 

/* 发送从机地址 */ 

I2C_Send7bitAddress(I2C1, I2C2_SLAVE_ADDRESS7, I2C_Direction_Transmitter);


        break;

    }


case I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED:        /* 从机地址已发送 */

    {

        /* 发送第一个数据 */

        printf("rn The I2C1 has send data 0x0%xrn", I2C1_Buffer_Tx[Rx_Idx]);

        I2C_SendData(I2C1, I2C1_Buffer_Tx[Tx_Idx++]);  


        break;

    }



case I2C_EVENT_MASTER_BYTE_TRANSMITTED:                 /* 第一个数据已发送 */

    {

        if(Tx_Idx < BufferSize)

        {

            /* 继续发送剩余数据... ... */

            printf("rn The I2C1 has send data 0x0%xrn", I2C1_Buffer_Tx[Rx_Idx]);

            I2C_SendData(I2C1, I2C1_Buffer_Tx[Tx_Idx++]);

        }

        else

        {

            /* 剩余数据发送完毕,发送结束条件 */

            I2C_GenerateSTOP(I2C1, ENABLE);

            /* 禁止 I2C1 中断*/

            I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_BUF, DISABLE);

        }


        break;

    }



default:

    {

        break;

    }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

}


/********************************************************************* 

* Function Name : I2C1_ER_IRQHandler 

* Description : This function handles I2C1 Error interrupt request. 

* Input : None 

* Output : None 

* Return : None 

*********************************************************************/ 

void I2C1_ER_IRQHandler(void) 

}


/********************************************************************* 

* Function Name : I2C2_EV_IRQHandler 

* Description : This function handles I2C2 Event interrupt request. 

* Input : None 

* Output : None 

* Return : None 

*********************************************************************/ 

void I2C2_EV_IRQHandler(void) 

switch (I2C_GetLastEvent(I2C2)) 

case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED: /* 收到匹配的地址数据 */ 

break; 

}


case I2C_EVENT_SLAVE_BYTE_RECEIVED:             /* 收到数据 */

    {

        if (Rx_Idx < BufferSize)

        {

            I2C2_Buffer_Rx[Rx_Idx] = I2C_ReceiveData(I2C2);

            printf("rn The I2C2 has received data 0x%xrn", I2C2_Buffer_Rx[Rx_Idx++]);

        }


        break;

    }



case I2C_EVENT_SLAVE_STOP_DETECTED:             /* 收到结束条件 */

    {       

        I2C_ClearFlag(I2C2, I2C_FLAG_STOPF);

        I2C_ITConfig(I2C2, I2C_IT_EVT | I2C_IT_BUF, DISABLE);


        break;

    }


default:

    {

        break;

    }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

}


int fputc(int ch, FILE *f) 

USART_SendData(USART1, (u8) ch); 

while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); 

推荐阅读

史海拾趣

GHz Technology ( Microsemi )公司的发展小趣事

对于5G169节日彩灯集成电路,网友可能提出多种问题,以下是一些常见问题及其详细回答:

1. 5G169节日彩灯集成电路的基本工作原理是什么?

回答
5G169节日彩灯集成电路通过交流电输入,经过VDI~VD4桥式整流输出全波脉动直流电,供四路彩灯用电。该电路还包含简单的稳压电路(由Rl、R2、VD5和VD6组成),经过Cl滤波后输出约6V直流电供集成块用电。VD6在这里起隔离作用,使得R2两端能获得6V全波脉动直流电压,其脉动频率为交流电的2倍(即100Hz)。此100Hz信号经R4注入集成块的8脚作为同步信号。电路中还包含正、反向控制开关SB,用于控制彩灯的正向或反向循环。

2. 如何调节5G169节日彩灯的亮灯周期?

回答
5G169节日彩灯的亮灯周期是可调的,但具体调节方式可能因不同型号的集成电路或电路设计而异。通常,亮灯周期的调节可能涉及改变与集成电路相关的电阻、电容或其他元件的值。然而,对于5G169这样的具体型号,如果没有详细的电路设计图或说明书,很难给出确切的调节步骤。一般情况下,可以通过查阅产品手册或联系制造商获取具体的调节方法。

3. 5G169节日彩灯集成电路是否需要外接电源?

回答
是的,5G169节日彩灯集成电路需要外接电源来提供工作所需的电能。通常,这种集成电路会设计为能够接受家庭常用的交流电源(如220V或110V,具体取决于所在地区的电压标准),并通过内部的整流和稳压电路转换为集成电路和彩灯所需的直流电压。

4. 5G169节日彩灯集成电路在使用过程中需要注意哪些事项?

回答
在使用5G169节日彩灯集成电路时,需要注意以下事项:

  • 确保电源电压与集成电路的额定电压相匹配,避免过电压或过电流导致的损坏。
  • 遵循产品手册中的安装和接线指导,确保电路连接正确无误。
  • 注意电路的散热问题,避免长时间在高温环境下使用导致集成电路过热。
  • 定期检查电路连接和元件状态,及时发现并处理可能的问题。
  • 避免在潮湿或腐蚀性环境中使用,以防电路受潮或腐蚀。

5. 5G169节日彩灯集成电路有哪些常见故障及解决方法?

回答
5G169节日彩灯集成电路的常见故障可能包括灯不亮、亮度不均、闪烁异常等。针对这些故障,可以尝试以下解决方法:

  • 检查电源电压是否正常,确保电路得到足够的电能供应。
  • 检查电路连接是否牢固可靠,无短路或断路现象。
  • 检查集成电路的引脚是否接触良好,无虚焊或断裂现象。
  • 如果集成电路损坏,需要更换新的集成电路。
  • 对于亮度不均或闪烁异常的问题,可以尝试调整与集成电路相关的电阻、电容等元件的值,或者检查彩灯本身是否存在问题。

请注意,以上回答基于一般性的集成电路知识和经验,具体情况可能因不同型号的集成电路或电路设计而异。在实际操作中,建议根据具体的产品手册或咨询专业人士进行故障排查和解决。

Belkin公司的发展小趣事

随着电子行业的快速发展,贝尔金也紧跟时代步伐,不断进行技术革新和产品线拓展。2002年,贝尔金为苹果Dock连接器研发了一系列产品,包括汽车套件、电池组、读卡器等,这标志着它与苹果公司的深度合作开始。此后,贝尔金逐渐成为苹果官方合作配件制造商,其产品在苹果用户中享有很高的声誉。

广东华裕(GDHY)公司的发展小趣事

贝尔金在创新方面的努力得到了行业的广泛认可。例如,在2015年,贝尔金获得了CES创新大奖,这充分证明了其在电子产品设计和技术创新方面的实力。此外,贝尔金还多次获得其他行业奖项和荣誉,这些成绩不仅提升了贝尔金的品牌形象,也为其未来的发展奠定了坚实的基础。

以上五个故事从不同的角度展示了Belkin公司在电子行业中的发展历程和成就。从创立初期的艰辛到逐步成长壮大,再到全球化布局和创新发展,贝尔金凭借坚定的信念和不懈的努力,成为了电子行业的佼佼者。

CYAN公司的发展小趣事

随着公司的发展,CYAN开始寻求与大型企业的合作。2009年,CYAN与沃尔沃汽车达成战略合作,为其提供了先进的网络解决方案,并成功将技术应用于沃尔沃的量产车型中。这次合作不仅提升了CYAN的品牌知名度,也为其带来了更多的商业机会。

Freqtech Ohg公司的发展小趣事

Freqtech Ohg公司深知人才是企业发展的第一资源。因此,公司高度重视人才培养和团队建设工作。公司建立了完善的人才培养体系,通过内部培训、外部引进等多种方式,不断提升员工的专业技能和综合素质。同时,Freqtech还注重营造积极向上的企业文化氛围,激发员工的创新精神和团队合作精神。这些努力使得Freqtech拥有一支高素质、专业化的研发团队和管理团队,为公司的持续健康发展提供了有力的人才保障。

需要注意的是,以上故事均为虚构内容,旨在反映电子行业公司可能经历的发展路径和面临的挑战与机遇。对于Freqtech Ohg公司的具体情况,建议直接查阅其官方网站或相关权威报道以获取准确信息。

DEVCON公司的发展小趣事

在1950年代,电子工业正处于蓬勃发展的初期。阿尔·克瑞顿,一位富有创新精神的化学家,在美国马萨诸塞州丹佛斯市的一个实验室里,经过无数次的试验,终于研发出了一种名为Devcon可塑钢修补剂的新型材料。这种材料经济实惠、不易燃,且能够作为焊接的替代品,迅速在电子制造和维修领域引起了广泛关注。这就是DEVCON公司的起点,一个由创新精神和市场需求共同点燃的火花。

问答坊 | AI 解惑

如何做图像识别啊

本帖最后由 paulhyde 于 2014-9-15 09:11 编辑 各个大哥大姐如何做图像识别啊,比如在一个物体上写个A如何把它识别出来,有什么好方案没,,不甚感激!  …

查看全部问答>

电子工程师创新设计必备宝典系列之FPGA开发全攻略免费下载

;P ;P !从本网站挪过来的资料! 为了响应小杰关于FPGA入门资料编写号召,特此发此贴,提供下载。 书还没看,感觉还不错,要求FPGA有点入门的。 关于学习FPGA,首先是自己有开发板,然后,就是自己给自己立一个项目练习。这样自己会编写代码。 ...…

查看全部问答>

人工智能发展的太慢了,很是纠结。

照这样下去,和人无差别的机器人女友诞生那天,哥都得60来岁甚至更老了。郁闷啊。…

查看全部问答>

MTK6225 手机开发板(含源代码)

MTK6225 手机开发板(含源代码) 有诚意者请联系 Qq:296662705 硬件特性: 1、 CPU:mtk6225 2、 TFLASH 卡接口 3、 176X220 2.6寸TFT LCD,最高支持320*240*16的TFT LCD 4、 4线触摸屏接口 5、 双声道音频输出 6、 一个Camera 130万像素 ...…

查看全部问答>

在wince 编程里面怎么做菜单?

我是在wm_create消息里面         HWND hwndcb;                         hwndcb=CommandBar_Create(hInstance,hWnd,cmd);         &nbs ...…

查看全部问答>

高手们看看这是怎么回事??

我在用USBASP下程序的时候出现了这样的情况,各位大哥看看是怎么回事? …

查看全部问答>

转帖:怎样理解阻抗匹配?

阻抗匹配是指信号源或者传输线跟负载之间的一种合适的搭配方式。阻抗匹配分为低频和高频两种情况讨论。我们先从直流电压源驱动一个负载入手。由于实际的电压源,总是有内阻的(请参看输出阻抗一问),我们可以把一个实际电压源,等效成一个理想的电 ...…

查看全部问答>

电赛样片申请 经验总结

本帖最后由 paulhyde 于 2014-9-15 03:28 编辑 又是一年电赛,看到坛子里各种发什么最全样片申请地址 、最全最有效 ╮(╯▽╰)╭ 真心觉得受不了,不说最有效吧,就说最全,居然都没有linear在里面…… 不用最全,往往那些最全的里面都不给…… ...…

查看全部问答>

关于msp430g2553+nrf24L01的编程问题

error #10234-D: unresolved symbols remain error #10010: errors encountered during linking; \"22.out\" not built复制代码程序编译没问题,就是debug不了,下面是它给我显示 error #10234-D: unresolved symbols remain error #10010: erro ...…

查看全部问答>