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

本文介绍了I2C总线模拟功能的实现方法,并提供了一个简单的测试程序示例。通过模拟I2C设备读写操作,验证了I2C组件的基本功能。

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

测试程序运行界面:


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

 
 
  1. public class I2CComponent : I2cDevice  
  2.    {  
  3.        public byte[] bytData = new byte[8];  
  4.        protected override void DeviceRead(byte[] data)  
  5.        {  
  6.            try 
  7.            {  
  8.                for (int i = 0; i < data.Length; i++)  
  9.                {  
  10.                    if (i < bytData.Length) data[i] = bytData[i];  
  11.                }  
  12.           }  
  13.            catch { }   
  14.            base.DeviceRead(data);  
  15.        }  
  16.        protected override void DeviceWrite(byte[] data)  
  17.        {  
  18.            try 
  19.            {  
  20.                for (int i = 0; i < data.Length; i++)  
  21.                {  
  22.                    if (i < bytData.Length) bytData[i] = data[i];  
  23.                }  
  24.            }  
  25.            catch { }   
  26.            base.DeviceWrite(data);  
  27.        }  
  28.        protected override void DeviceBeginTransaction()  
  29.        {  
  30.            base.DeviceBeginTransaction();  
  31.        }  
  32.        protected override void DeviceEndTransaction()  
  33.        {  
  34.            base.DeviceEndTransaction();  
  35.        }  
  36.    }  

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

 
 
  1.  static SPI _spi;  
  2.     public static void Main()  
  3.     {  
  4.         OutputPort[] output = new OutputPort[8];  
  5.         InputPort[] input = new InputPort[8];   
  6.           
  7.         //叶帆模拟器GPIO的pin定义  
  8.         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 };  
  9.         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 };  
  10.    
  11.         //SPI的pin定义  
  12.         _spi=new SPI(new SPI.Configuration((Cpu.Pin)30, true, 0, 0, falsefalse, 4000, SPI.SPI_module.SPI1));  
  13.    
  14.         //I2C定义                           模拟器I2C地址为100 时钟速度不要设置太小否则会有问题  
  15.         I2CDevice I2CBus = new I2CDevice(new I2CDevice.Configuration(100, 200));  
  16.    
  17.         for (int i = 0; i < 8; i++)  
  18.         {  
  19.             input[i] = new InputPort(pin_I[i], false, Port.ResistorMode.PullDown);  
  20.             output[i] = new OutputPort(pin_Q[i], false);  
  21.         }  
  22.    
  23.         int intNum = 0;  
  24.         while (true)  
  25.         {  
  26.             output[intNum].Write(!output[intNum].Read());  
  27.             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());  
  28.             Debug.Print("AD : "+ReadWriteAD((Int16)intNum).ToString() + " " + intNum.ToString());  
  29.             //---------------------------------------  
  30.    
  31.             //I2C读写  
  32.             byte[] bytRData = new byte[8];  
  33.             byte[] bytWData = new byte[3];  
  34.             bytWData[0] = (byte)intNum;  
  35.             bytWData[1] = (byte)(intNum * 2);  
  36.             bytWData[2] = (byte)(intNum * 3);  
  37.             I2CDevice.I2CTransaction[] i2c = new I2CDevice.I2CTransaction[2];  
  38.             i2c[0]=I2CBus.CreateReadTransaction(bytRData);  
  39.             i2c[1] = I2CBus.CreateWriteTransaction(bytWData);  
  40.             I2CBus.Execute(i2c, 100);   //执行  
  41.    
  42.             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());  
  43.    
  44.             //---------------------------------------  
  45.             if (++intNum > 7) intNum = 0;  
  46.             Thread.Sleep(800);  
  47.         }  
  48.     }  
  49.     public static Int16 ReadWriteAD(Int16 value)  
  50.     {  
  51.         byte[] bout = new byte[2];  
  52.         byte[] bin = new byte[2];  
  53.         bout[0] = (byte)(value >> 8);  
  54.         bout[1] = (byte)(value & 0xff);  
  55.         _spi.WriteRead(bout, bin);  
  56.         Int16 aw0=(Int16)((bin[0] << 8) + bin[1]);  
  57.         return aw0;  
  58.     }  
  59. }   

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

 ]












本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/322937,如需转载请自行联系原作者

该仿真器允许通过PC向I2C总线发送数据或从I2C总线接收数据,从而与I2C设备进行通信。 硬件部件: Microchip Technology ATMEGA16A-PU× 1个 意法半导体LD1117AV33× 1个 德州仪器LM2596T-5.0× 1个 安森美半导体2N7000× 2个 瑞萨2SC945× 5 KEMET电子公司EC2-5NU DPDT继电器× 3 I2C是一种流行的数据总线,用于与板间外设进行通信。如今,基于I2C的芯片和模块可广泛用于许多类别,包括数据存储,ADC / DAC,I / O扩展器,传感器等。 I2C主模式仿真器通过向I2C总线发送数据或从I2C总线接收数据来与I2C设备进行通信。要发出I2C命令,仿真器应通过USB端口连接到PC。初始化仿真器后,PC可以直接控制I2C从芯片/模块。 成品原型的正视图 该仿真器基于ATmega16A MCU。USB通信通道是使用V-USB固件开发的。 为了简化组装,此仿真器的PCB设计在单侧板上。PCB的尺寸为96.77mm×110.73mm。本项目中使用的所有零件均为通孔型,通常可用。 完成的原型的后视图 该仿真器需要外部电源,建议的电源电压在12V至15V之间。 控制软件和命令 仿真器的控制软件是使用libusb开发的,并且仅在Linux操作系统上进行过测试。当前的固件和控制软件支持100kHz,250kHz和400kHz时钟速率的I2C仿真。 以下命令可用于I2C测试终端: • init-以给定的时钟速率初始化I2C总线。 • 开始-发行启动条件,I2C总线。 • 停止-向I2C总线发出STOP条件。 • 写-将给定的字节值写入I2C总线。 • write- address-使用读/写标志设置从站地址。 • 读取-读取从从设备接收到的数据字节。 • 输出电压-将输出电压设置为5V或3.3V的命令。 • 重置-重置仿真器和I2C总线。 • 退出-从终端应用程序退出。 • help-显示帮助屏幕。 以上所有命令均在GitHub存储库的项目文档中进行了说明。 I2C测试终端具有一个自动完成的命令提示符。若要使用此选项,请在命令提示符下按两次TAB键。 在启动终端控制应用程序之前,I2C仿真器设备必须连接到PC并需要加电。 仿真器测试设置 下图说明了测试I2C终端的简单布局。在这种布局中,I2C端子连接到24LC01串行EEPROM IC。 连接到24LC01 EEPROM。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值