本文最后更新于23 天前,其中的信息可能已经过时,如有错误请发送邮件到tudougin@163.com
1. 串行接口IICA
1.1 串行接口IICA的功能
- I²C总线模式(支持多主控):
此模式通过串行时钟(SCLAn)和串行数据总线(SDAAn)的2条线,与多个设备进行8位数据传送。符合I 2C总线格式,主控设备能在串行数据总线上给从属设备生成“开始条件”、“地址”、“传送方向的指示”、“数据”和“停止条件”。从属设备通过硬件自动检测接收到的状态和数据。能通过此功能简化应用程序的I²C总线控制部分。
因为串行接口IICA的SCLAn引脚和SDAAn引脚用作漏极开路输出,所以串行时钟线和串行数据总线需要上拉电阻。
- 运行停止模式:是用于不进行串行传送时的模式,能降低功耗
2. I²C代码
2.1 I²C配置
初始化 IIC 通道。内容包括:时钟、地址位宽、使能模块、状态寄存器初始化等。
IICA0_Init();
这是通过宏控制初始化函数内部速率配置的开关:
IICA_STANDARD_MODE
:标准模式,通信速率 ≤ 100kHz。IICA_FAST_MODE
:快速模式,通信速率 ≤ 400kHz。
//#define IICA_STANDARD_MODE
#define IICA_FAST_MODE
设定I²C端口引脚:
/* ToDo: You can allocate the SCLA0 to any desired pins with PxxCFG register */
#define SCLA0_PORT_SETTING() do{ \
PORT->P36CFG = PTCFG_SCLA0; /* 把 P36 映射为 SCL0 */ \
PORT->PM3 &= ~(1 << 6); /* 配置为输出方向(清除 P36 的输入使能) */ \
PORT->PMC3 &= ~(1 << 6); /* 配置为数字功能(不是模拟) */ \
}while(0)
/* ToDo: You can allocate the SDAA0 to any desired pins with PxxCFG register */
#define SDAA0_PORT_SETTING() do{ \
PORT->P37CFG = PTCFG_SDAA0; /* 把 P37 映射为 SDA0 */ \
PORT->PM3 &= ~(1 << 7); /* 配置为输入输出方向(I²C 双向) */ \
PORT->PMC3 &= ~(1 << 7); /* 配置为数字功能 */ \
}while(0)
2.2 主机模式下的I²C通信
#define SLVADDR (0x98U) /* the IIC Slave Address*/
uint8_t tx_buf[] = {0xAA,0x55,0xA5};
status = IICA0_MasterSend(SLVADDR, tx_buf, 3, 20);
uint8_t rx_buf[3] = {0};
status = IICA0_MasterReceive(SLVADDR, rx_buf, 3, 20);