3273|3

60

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

用Energia写一个同样功能的USB<->I2C工具 [复制链接]

用CCS写的复杂版在这里https://bbs.eeworld.com.cn/thread-374278-1-6.html

最近有在玩Arduino,就觉得这样的编程思想很不错,完全无需知道底层代码和寄存器的实现方式,只要用封装好的函数就可以实现相应的功能,开发者只要专注在逻辑和应用上就可以了,方便许多。于是回过头来玩一下Launchpad,这次用Energia,做一个之前做过的USB-I2C工具,代码量小很多,调试错误量也小很多,方便不少,我就把代码贴在这里,大家玩玩。。呵呵
  1. #include   // Need the Wire library for I2C communication

  2. unsigned char dataBuff[130];          // The data buffer
  3.                                       // The effective data area is 128 bytes.
  4. unsigned char oneByte = 0;            // For holding the byte during each Wire.read() action
  5. unsigned int  dataBuffIdx = 0;        // Data position during read and write
  6. unsigned char inputDataComplete = 0;  // Indicate the input is finished
  7.                                       // Whenever a CR or LF is received
  8.                                       // or input data length excceed the effective data length
  9. unsigned int  availableBytes = 0;     // Number of bytes in Serial RX buffer for read
  10. unsigned char slaveAddr = 0;          // The 7-bit slave address
  11. unsigned char i2cRW = 0;              // The I2C RW bit
  12.                                       // 0x00 for master write
  13.                                       // 0x01 for master read
  14. unsigned char trDataLen = 0;          // The length of data to be transfered
  15.                                       // either to I2C device or serial console
  16. unsigned char CRLF[2] = {0x0D, 0x0A}; // The CRLF

  17. void setup() {
  18.   Serial.begin(9600);  // Start serial dialog @9600 BR
  19.   Wire.begin();        // Prepare I2C peripherals
  20. }

  21. void loop() {
  22.   if (inputDataComplete == 1) {                    // Data receive finished
  23.                                                    // Go on processing data
  24.     if (dataBuffIdx > 2) {                         // At lease 3 bytes in the data buffer
  25.       i2cRW = dataBuff[dataBuffIdx - 1];           // The last byte received indicates I2C RW action
  26.       slaveAddr = dataBuff[dataBuffIdx - 2];       // The I2C slave address is the byte before the RW byte
  27.       if (i2cRW == 0x00) {                         // Master write
  28.         trDataLen = dataBuffIdx - 2;               // The actual data length
  29.                                                    // Excluding address byte and RW byte
  30.         // The I2C master write action
  31.         Wire.beginTransmission(slaveAddr);
  32.         Wire.write(dataBuff, trDataLen);
  33.         Wire.endTransmission();
  34.         // --
  35.       }
  36.         if (i2cRW == 0x01) {                       // Master read
  37.         trDataLen = dataBuff[0];                   // The 1st byte is the number of bytes to read
  38.         dataBuffIdx = 0;                           // Clear the buffer index for read counting
  39.         // The I2C master read action
  40.         Wire.requestFrom(slaveAddr, trDataLen);
  41.         while(Wire.available()) {
  42.           dataBuff[dataBuffIdx] = Wire.read();
  43.           dataBuffIdx++;
  44.         }
  45.         // --
  46.         Serial.write(dataBuff, (unsigned char)dataBuffIdx);
  47.                                                    // Write the data to serial console
  48.                                                    // Enforce the data length to be 128 bytes at max
  49.         Serial.write(CRLF, 2);                     // Print CRLF indicating data ending
  50.       }
  51.       
  52.       // Reset data count and action status
  53.       dataBuffIdx = 0;
  54.       inputDataComplete = 0;
  55.       // Clear the serial buffer
  56.       Serial.flush();
  57.     }
  58.   } else {                                         // Read incoming data if available
  59.     availableBytes = Serial.available();           // Get number of bytes available
  60.                                                    // for reading in serial buffer
  61.     while (availableBytes && !inputDataComplete) { // Read data when there are some bytes available
  62.                                                    // And the input is not finished
  63.       if (dataBuffIdx > 129) {                     // We will ignore the data
  64.                                                    // when the buffer limit is reached
  65.         inputDataComplete = 1;                     // And also make the input is finished
  66.         continue;                                  // Skip all following codes
  67.       }
  68.       oneByte = Serial.read();                     // Read 1 byte from the serial buffer
  69.       if (oneByte == 0x0D || oneByte == 0x0A) {    // Either CR(0x0D) or LF(0x0A) indicates the end of input
  70.         inputDataComplete = 1;                     // Make the input is finished
  71.       } else {
  72.         dataBuff[dataBuffIdx] = oneByte;           // Copy the byte to the data buffer
  73.         availableBytes--;
  74.         dataBuffIdx++;
  75.       }
  76.     }
  77.   }
  78. }
复制代码

最新回复

学习了   详情 回复 发表于 2013-10-12 19:39

赞赏

1

查看全部赞赏

 
点赞 关注

回复
举报

60

帖子

0

TA的资源

纯净的硅(初级)

沙发
 
这次发送数据的格式改变了,如下:
I2C写入:[1~128 Bytes Data] [7-bit Slave Address] 0x00 0x0D 0x0A
I2C读取:[Number of Bytes to Read] [7-bit Slave Address] 0x01 0x0D 0x0A

[ 本帖最后由 karajanlee 于 2013-9-18 13:39 编辑 ]
 
 

回复

5015

帖子

13

TA的资源

裸片初长成(初级)

板凳
 
赞一个,我们板块上也开始使用arduino的开发工具。期待lz更多的关于arduino的介绍。
 
个人签名《MCU工程师炼成记》作者之一
 
 

回复

553

帖子

0

TA的资源

纯净的硅(中级)

4
 
学习了
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表