打印
[PIC®/AVR®/dsPIC®产品]

使用MCC学习PIC单片机 – MSSP 主同步串行端口 (I2C主模式)

[复制链接]
3749|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

主同步串行端口(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);







使用特权

评论回复
沙发
navy_yang| | 2019-4-23 10:50 | 只看该作者
非常感谢,刚好在调试IIC,下次可以测试一下USART不?

使用特权

评论回复
板凳
CoolSilicon| | 2019-4-24 09:53 | 只看该作者
加油加油..
用MCC生成的I2C代码的话, 需要在自动生成的main函数里面使能外设中断和全局中断, 然后才可以工作....

使用特权

评论回复
地板
天真的傻子| | 2019-10-24 17:52 | 只看该作者
CoolSilicon 发表于 2019-4-24 09:53
加油加油..
用MCC生成的I2C代码的话, 需要在自动生成的main函数里面使能外设中断和全局中断, 然后才可以工 ...

你好,这样用I2C 一定要用中断吗

使用特权

评论回复
5
CoolSilicon| | 2019-10-25 14:02 | 只看该作者
天真的傻子 发表于 2019-10-24 17:52
你好,这样用I2C 一定要用中断吗

你也可以用查询的方式做啊...查询不过会增加MCU额外的开销, 因为经常要查询嘛.

使用特权

评论回复
6
heisexingqisi| | 2019-10-25 22:49 | 只看该作者
可以同时实现SPI或I2C ?

使用特权

评论回复
7
heisexingqisi| | 2019-10-25 22:50 | 只看该作者
还可以图形化配置,强大。

使用特权

评论回复
8
huiyong828| | 2019-11-11 09:52 | 只看该作者
现在正在学习MCC插件生成的I2C主模式下收发命令函数,很多地方不清楚如何调用,例如
void I2C_MasterWrite(
                                uint8_t *pdata,
                                uint8_t length,
                                uint16_t address,
                                I2C_MESSAGE_STATUS *pstatus);
写命令如何用这块头文件中有相应的说明,因为英语差,能说明下用法吗?

使用特权

评论回复
9
拾风07029| | 2022-11-24 13:30 | 只看该作者
MCC配置I2C ,系统时钟fcy=60MHZ,I2c的clock想配置成低于100KHZ,这样的话I2C1BRG就得重载为650,但是I2C1BRG寄存器只有0-8位有效,MCC中设置不了大于0x1FF的值,怎么办?

使用特权

评论回复
10
abotomson| | 2022-12-1 16:53 | 只看该作者
如何配置从机模式呢?              

使用特权

评论回复
11
averyleigh| | 2022-12-1 18:56 | 只看该作者
MCC配置一路PWM输出教程有吗

使用特权

评论回复
12
rosemoore| | 2022-12-1 20:04 | 只看该作者
PIC单片机  代码配置器(MCC)

使用特权

评论回复
13
saservice| | 2022-12-1 22:18 | 只看该作者
MCC18.exe这个C编译在哪里可以下到?

使用特权

评论回复
14
modesty3jonah| | 2022-12-2 20:50 | 只看该作者
pic-mcc程序在什么平台上实现

使用特权

评论回复
15
burgessmaggie| | 2022-12-3 12:52 | 只看该作者
使用MCC学习PIC单片机简单多了。   

使用特权

评论回复
16
geraldbetty| | 2022-12-4 21:52 | 只看该作者
正在学习中,我现在在用PIC18F66K22

使用特权

评论回复
17
ccook11| | 2022-12-6 13:36 | 只看该作者
如何使用MPLAB代码配置器              

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

190

帖子

11

粉丝