.Net Micro Framework研究—带I2C总线的模拟器

简介: I2C以前没有怎么接触过,所以做它的模拟功能,只能靠着感觉走,有不妥之处,还望方家指正。做出了spi相关的模拟功能,做I2C相对也就不难了,只不过用户操作I2C总线读写数据的时候要稍微麻烦一点。

I2C以前没有怎么接触过,所以做它的模拟功能,只能靠着感觉走,有不妥之处,还望方家指正。做出了spi相关的模拟功能,做I2C相对也就不难了,只不过用户操作I2C总线读写数据的时候要稍微麻烦一点。

测试程序运行界面:
 image.png

模拟器中的I2C总线的相关代码如下:

     public class I2CComponent : I2cDevice
    {
        public byte[] bytData = new byte[8];
        protected override void DeviceRead(byte[] data)
        {
            try
            {
                for (int i = 0; i < data.Length; i++)
                {
                    if (i < bytData.Length) data[i] = bytData[i];
                }
           }
            catch { }
            base.DeviceRead(data);
        }
        protected override void DeviceWrite(byte[] data)
        {
            try
            {
                for (int i = 0; i < data.Length; i++)
                {
                    if (i < bytData.Length) bytData[i] = data[i];
                }
            }
            catch { }
            base.DeviceWrite(data);
        }
        protected override void DeviceBeginTransaction()
        {
            base.DeviceBeginTransaction();
        }
        protected override void DeviceEndTransaction()
        {
            base.DeviceEndTransaction();
        }
    }

测试代码如下(还是在原来程序的基础上进行扩充):

    static SPI _spi;
    public static void Main()
    {
        OutputPort[] output = new OutputPort[8];
        InputPort[] input = new InputPort[8]; 
       
        //叶帆模拟器GPIO的pin定义
        Cpu.Pin[] pin_I = new Cpu.Pin[8] { (Cpu.Pin)10, (Cpu.Pin)11, (Cpu.Pin)12, (Cpu.Pin)13, (Cpu.Pin)14,(Cpu.Pin)15, (Cpu.Pin)16, (Cpu.Pin)17 };
        Cpu.Pin[] pin_Q = new Cpu.Pin[8] { (Cpu.Pin)20, (Cpu.Pin)21, (Cpu.Pin)22, (Cpu.Pin)23, (Cpu.Pin)24, (Cpu.Pin)25, (Cpu.Pin)26, (Cpu.Pin)27 };
 
        //SPI的pin定义
        _spi=new SPI(new SPI.Configuration((Cpu.Pin)30, true, 0, 0, false, false, 4000, SPI.SPI_module.SPI1));
 
        //I2C定义                           模拟器I2C地址为100 时钟速度不要设置太小否则会有问题
        I2CDevice I2CBus = new I2CDevice(new I2CDevice.Configuration(100, 200));
 
        for (int i = 0; i < 8; i++)
        {
            input[i] = new InputPort(pin_I[i], false, Port.ResistorMode.PullDown);
            output[i] = new OutputPort(pin_Q[i], false);
        }
 
        int intNum = 0;
        while (true)
        {
            output[intNum].Write(!output[intNum].Read());
            Debug.Print("I   : "+input[0].Read().ToString() + " " + input[1].Read().ToString() + " " + input[2].Read().ToString() + " " + input[3].Read().ToString() + " " + input[4].Read().ToString()+ " " + input[5].Read().ToString() + " " + input[6].Read().ToString() + " " + input[7].Read().ToString());
            Debug.Print("AD : "+ReadWriteAD((Int16)intNum).ToString() + " " + intNum.ToString());
            //---------------------------------------
 
            //I2C读写
            byte[] bytRData = new byte[8];
            byte[] bytWData = new byte[3];
            bytWData[0] = (byte)intNum;
            bytWData[1] = (byte)(intNum * 2);
            bytWData[2] = (byte)(intNum * 3);
            I2CDevice.I2CTransaction[] i2c = new I2CDevice.I2CTransaction[2];
            i2c[0]=I2CBus.CreateReadTransaction(bytRData);
            i2c[1] = I2CBus.CreateWriteTransaction(bytWData);
            I2CBus.Execute(i2c, 100);   //执行
 
            Debug.Print("I2C : " + bytRData[0].ToString() + " " + bytRData[1].ToString() + " " + bytRData[2].ToString() + " " + bytRData[3].ToString() + " " + bytRData[4].ToString() + " " + bytRData[5].ToString() + " " + bytRData[6].ToString() + " " + bytRData[7].ToString());
 
            //---------------------------------------
            if (++intNum > 7) intNum = 0;
            Thread.Sleep(800);
        }
    }
    public static Int16 ReadWriteAD(Int16 value)
    {
        byte[] bout = new byte[2];
        byte[] bin = new byte[2];
        bout[0] = (byte)(value >> 8);
        bout[1] = (byte)(value & 0xff);
        _spi.WriteRead(bout, bin);
        Int16 aw0=(Int16)((bin[0] << 8) + bin[1]);
        return aw0;
    }
} 

好了,模拟器的工作暂时告一个段落,有时间把该模拟器完善一下,给感兴趣的网友共享,这样就不用购买硬件就可以测试一些有意思的代码和功能了(一个测试板卡要好几百美元呢!)。

相关文章
|
1月前
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
47 1
|
1月前
|
开发框架 缓存 监控
NET Framework 到 .NET 5/6 的迁移是重大的升级
本文详细介绍了从 .NET Framework 4.8 迁移到 .NET 5/6 的过程,通过具体案例分析了迁移策略与最佳实践,包括技术栈评估、代码迁移、依赖项更新及数据库访问层的调整,强调了分阶段迁移、保持代码可维护性及性能监控的重要性。
49 3
|
1月前
|
机器学习/深度学习 编解码 算法
【小样本图像分割-4】nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation
《nnU-Net: 自适应框架用于基于U-Net的医学图像分割》是一篇2018年的论文,发表在Nature上。该研究提出了一种自适应的医学图像分割框架nnU-Net,能够自动调整模型的超参数以适应不同的数据集。通过2D和3D U-Net及级联U-Net的组合,nnU-Net在10个医学分割数据集上取得了卓越的性能,无需手动调整。该方法强调数据增强、预处理和训练策略等技巧,为医学图像分割提供了一个强大的解决方案。
69 0
【小样本图像分割-4】nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
本文讨论了在基于.NET 6和.NET Framework的WinForms项目中添加图表控件的不同方法。由于.NET 6的WinForms项目默认不包含Chart控件,可以通过NuGet包管理器安装如ScottPlot等图表插件。而对于基于.NET Framework的WinForms项目,Chart控件是默认存在的,也可以通过NuGet安装额外的图表插件,例如LiveCharts。文中提供了通过NuGet添加图表控件的步骤和截图说明。
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
|
3月前
|
开发框架 缓存 前端开发
实战.NET Framework 迁移到 .NET 5/6
从.NET Framework 迁移到.NET 5/6 是一次重要的技术革新,涵盖开发环境与应用架构的全面升级。本文通过具体案例详细解析迁移流程,包括评估现有应用、利用.NET Portability Analyzer 工具识别可移植代码、创建新项目、逐步迁移代码及处理依赖项更新等关键步骤。特别关注命名空间调整、JSON 序列化工具更换及数据库访问层重构等内容,旨在帮助开发者掌握最佳实践,确保迁移过程平稳高效,同时提升应用性能与可维护性。
129 2
|
3月前
|
开发框架 JSON 监控
实战指南:从 .NET Framework 迁移到 .NET 5/6 的策略与最佳实践
【8月更文挑战第28天】从 .NET Framework 迁移到 .NET 5/6 是一次重要的技术升级,涉及开发环境与应用架构的改进。本文通过具体案例分析,介绍迁移策略与最佳实践,帮助开发者顺利完成转变。
82 1
|
3月前
|
缓存 程序员
封装一个给 .NET Framework 用的内存缓存帮助类
封装一个给 .NET Framework 用的内存缓存帮助类
NET Framework安装失败的麻烦
本人机子环境是安装了VS2012,即安装了 .NET Framework4.5,现在要安装AutoCAD2013,而安装CAD2013需要安装4.0的Framework,由于本机已有高版本的Framework,安装自然报错: 又不想来卸载4.5,觉得麻烦,但又想装上CAD2013,唯一的方法是修改Setup.ini初始化文件。
1061 0
|
2月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
43 7
|
2月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
61 0
下一篇
无影云桌面