主同步串行端口(MSSP)模块是用于同其他外设或单片机进行通信的串行接口。这些外设可以是串行EEPROM、移位寄存器、显示驱动器以及A/D 转换器等。MSSP 外设支持两种串行接口,SPI和I2C。这一篇帖子主要介绍MSSP的I2C主机模式。
MCC中MSSP I2C主机模式配置界面:
I2C主模式原理简图:
I2C时钟
主机负责提供I2C通信所需的SCL时钟,因而通信波特率由主机确定。
MCC界面上输入一个有效的波特率生成器值,MCC会根据系统时钟Fosc自动计算出实际的通信波特率,显示在界面上。
SCL线有可能被从机拉低,来满足从机的处理时间。此时主机的时钟仲裁功能会暂停时钟发送操作,直到总线被从机释放为止。延长的SCL拉低时间,不会对主机波特率计数产生错误影响。
启动/重新启动/停止时序
主机负责产生启动,重复启动和停止时序。
启动时序开始之前,SCL线和SDA线都要为高电平。如果其中一条或两条为低电平,则启动时序失败,模块将其判为总线冲突。
重复启动时序是I2C总线标准规定的介于相邻两个字节传输之间的时序,既标志了前一字节传输的结束,又指示了下一字节传输的开始。
I2C地址
MSSP I2C主机发送地址。支持7bit地址和10bit地址。
7bit地址:使用地址字节的bit7-bit1,bit0为读写标志。
10bit地址:主机分两次发送。第一次发送高字节:1 1 1 1 0 A9 A8 0; 第二次发送低字节A7:A0。
MCC界面上可选择7bit地址或10bit地址;MCC生成的代码兼容这两种地址长度。会根据界面上的选择,将地址长度预定义设为true 或 false。
#define I2C1_7bit true // true: 7bit 地址 false: 10bit 地址
I2C数据
发送数据时,为避免意外的启动或停止条件产生,在SCL下降沿之后,SDA电平可保持一段时间,具体的,有100ns和300ns两种可供选择,见MCC界面。
MCC生成代码
初始化
void I2C1_Initialize(void);
两个中断:I2C传输状态中断,总线冲突中断
void I2C1_ISR ( void );
void I2C1_BusCollisionISR( void );
主机读和主机写API
void I2C1_MasterWrite( uint8_t *pdata, uint8_t length, uint16_t address, I2C1_MESSAGE_STATUS *pflag)
void I2C1_MasterRead(uint8_t *pdata, uint8_t length, uint16_t address, I2C1_MESSAGE_STATUS *pflag)
查询是否通信完成
inline void I2C1_WaitForLastPacketToComplete();
发送数据链表维护
void I2C1_MasterTRBInsert( uint8_t count, I2C1_TRANSACTION_REQUEST_BLOCK *ptrb_list, I2C1_MESSAGE_STATUS *pflag)
void I2C1_MasterReadTRBBuild(I2C1_TRANSACTION_REQUEST_BLOCK *ptrb, uint8_t *pdata, uint8_t length, uint16_t address)
void I2C1_MasterWriteTRBBuild(I2C1_TRANSACTION_REQUEST_BLOCK *ptrb, uint8_t *pdata, uint8_t length, uint16_t address)
bool I2C1_MasterQueueIsEmpty(void);
bool I2C1_MasterQueueIsFull(void);
|