概述
在上一篇《普冉(PUYA)单片机开发笔记(10): I2C通信-配置从机-优快云博客》配置了 PY32F003 的 I2C 从机一侧,今天配置主机,并实现主-从机之间的报文收发。
为了完成这个实验,需要两块 PY32F003F18P 的开发板,连接线路如下表所示。注意主从机必须共地,要专门拉一根杜邦线把两块开发板的 GND 连接好。
| 开发板 | 主机 | 从机 | 备注 |
| 3V3 | 连接 | 连接 | 同一个电源 |
| GND | 连接 | 连接 | 主从机必须共地 |
| UART2_TX | PA1 | PA1 | 接到上位机 USB-TTL 模块 |
| UART2_RX | PA0 | PA0 | 接到上位机 USB-TTL 模块 |
| I2C_SCL | PA3 | PA3 | 主从用杜邦线连接 |
| I2C_SDA | PA2 | PA2 | 主从用杜邦线连接 |
连接好以后,在上位机开两个 XCOM 的窗口,各自连接主机和从机的串口,以便观察运行结果。就像附后“实验结果”中的截图,上位机的 COM3 接从机的串口,COM32 接主机的串口。
代码实现步骤
老套路,main.h 中定义函数原型,app_i2c.c 中实现这些函数,py32_f0xx_hal_msp.c 中对I2C 用到的管脚进行初始化,对用到的中断和 DMA 进行初始化;py32_f0xx_it.c 中重定向 I2C_IRQHandler。上干货 ;)
1. 在 main.h 中定义四个函数原型
#define I2C_COMM_TEST 1
#define I2C_SLAVE 0
...
...
#if(I2C_COMM_TEST)
/** ----------------------------------------------------------------------------
* @name : HAL_StatusTypeDef app_i2c_init(void);
* @brief : i2c 初始化
* @param :
* @retval : HAL_OK: 写入成功; 其它: 错误
* @remark : 上级函数必须检查操作返回值, 只有 HAL_OK 时才可继续操作
*** ----------------------------------------------------------------------------
*/
HAL_StatusTypeDef app_i2c_init(void);
/** ----------------------------------------------------------------------------
* @brief : i2c 测试使用的三个函数, 接收/发送/等待
* @param :
* @retval :
* @remark :
*** ----------------------------------------------------------------------------
*/
#if(I2C_SLAVE)
HAL_StatusTypeDef app_i2c_slave_receive(void);
HAL_StatusTypeDef app_i2c_slave_transmit(void);
#else
HAL_StatusTypeDef app_i2c_master_receive(void);
HAL_StatusTypeDef app_i2c_master_transmit(void);
#endif
void app_i2c_wait(void);
#endif
其中,为了在同一个工程中容纳主从两部分的代码,预定了 I2C_COMM_TEST 和 I2C_SLAVE,如果 I2C_SLAVE

本文详细描述了如何在PY32F003单片机上配置I2C主从通信,涉及硬件连接、代码实现、中断处理和DMA配置,以及实验结果和注意事项。
最低0.47元/天 解锁文章
820





