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

模拟I2C代码移植的问题

[复制链接]
1679|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
问题是这样,我从12f的一个模拟ic程序,要移植到16f上面,其中12f初始画有一段程序如下
#define SDA                        GP4                                // Data pin for i2c
#define SCK                        GP5                                // Clock pin for i2c
#define SDA_DIR                TRISIO4                        // Data pin direction
#define SCK_DIR                TRISIO5                        // Clock pin direction
我的理解是定义数值和信号方向
我的16f初始化是这样改的
#define SDA                        RB4                                        // Data pin for i2c
#define SCK                        RB6                                        // Clock pin for i2c

下面这两句如何改?
#define SDA_DIR                TRISIO4                        // Data pin direction
#define SCK_DIR                TRISIO5                        // Clock pin direction


使用特权

评论回复
沙发
chuandaoxy|  楼主 | 2020-12-8 13:58 | 只看该作者


上面的问题这样改
#define SDA_DIR                TRISB4                        // Data pin direction
#define SCK_DIR                TRISB6                        // Clock pin direction

新问题,下面是12f代码

void InitI2C(void)
{       
        //DataPinADCMask  = 1;        // 这是12f里面的语句,在后续应用也调用了
        //ClockPinADCMask = 1;        //我要是移植到16f如何修改?

        // Make SDA and SCK pins input initially
        SDA_DIR = 1;
        SCK_DIR = 1;
       
        // Write zero in output register of SDA and SCK pin
        SDA = 0;
        SCK = 0;
}

使用特权

评论回复
板凳
捉虫天师| | 2020-12-8 15:06 | 只看该作者
是不是还要设置为开漏模式。

使用特权

评论回复
地板
chuandaoxy|  楼主 | 2020-12-8 15:18 | 只看该作者
捉虫天师 发表于 2020-12-8 15:06
是不是还要设置为开漏模式。

关键是这两句有点困惑,是因为12f和16f有所区别?
DataPinADCMask  = 1;      
ClockPinADCMask = 1;  
12f的源代码还有这摸一个初始化
#define DataPinADCMask                ANS3
#define ClockPinADCMask                ANS3   

使用特权

评论回复
5
捉虫天师| | 2020-12-8 16:09 | 只看该作者
chuandaoxy 发表于 2020-12-8 15:18
关键是这两句有点困惑,是因为12f和16f有所区别?
DataPinADCMask  = 1;      
ClockPinADCMask = 1;  

编译后定位到原型,看看这代表什么。

使用特权

评论回复
6
hu9jj| | 2020-12-8 18:07 | 只看该作者
用MMC生成代码,然后到pin_manager.h文件里查看宏定义。

使用特权

评论回复
7
hu9jj| | 2020-12-8 18:11 | 只看该作者
如下图:

使用特权

评论回复
8
ynwa| | 2020-12-8 18:15 | 只看该作者
chuandaoxy 发表于 2020-12-8 15:18
关键是这两句有点困惑,是因为12f和16f有所区别?
DataPinADCMask  = 1;      
ClockPinADCMask = 1;  

不就是宏定义嘛,ClockPinADCMask和DataPinADCMask都对应ANS3这个寄存器。至于原来作者为啥这么写,可能只能问作者本人了。

用IO端口模拟I2C信号,无非是在软件中对IO的输入输出方向进行设置,然后对IO端口进行读写。你贴出来的代码,肯定是人家需要将这个IO配置为正确的数字IO模式,然后进行读写操作,来模拟I2C的读写时序。

这和12f和16f有没有区别完全没关系。同一个芯片里选择用不同的IO口来模拟,软件的设置都有可能不一样。因为不同的端口上复用的功能就都不同,有的还可能和模拟功能复用,有的带内部上拉/也有的不带,有的可以设置为开漏/有的不能....

使用特权

评论回复
9
Wayner| | 2021-11-15 21:36 | 只看该作者
可以麻烦你把整个代码发出来给我等低手参考一下吗

使用特权

评论回复
10
tail066| | 2021-11-17 17:30 | 只看该作者
IO模拟的话,百度满篇的都是,改改宏定义啥的,就可以了

使用特权

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

本版积分规则

855

主题

1044

帖子

4

粉丝