近段时间一个项目使用了atsha204,硬件电路设计好后,需要设计一个程序来测试芯片是否正常工作,于是写了一个读Serial Number的程序。

本文参考了博文 《atsha204a加密芯片使用攻略——配置篇》,该博文比较详细地说明了芯片该如何使用,更详细的芯片使用可以参考该文,这里不赘述了。

但是我也发现文章中的一些问题,以下内容都是我测试过可行的。

一、目标

我设定的测试目标是读取芯片的Serial Number。Serial Number在Config区域中。

二、数据包的格式
1、芯片通讯包基本格式

Word Address

Count

Data

CRC

1 byte

1 byte

N byte

2 byte

2、查找datasheet中Read Command的具体样式

可以具体看到Read Command的数据包具体样式如下所示。其中Count的长度不包括Word Address,但包括Count本身

Word Address
 Count
 Opcode
 Param1
 Param2
CRC
1 byte
1 byte
1 byte
1 byte
1 byte
2 byte

3、填充其它内容

接下来分别填充Qpcode、Param1和Param2的内容

3.1 Qpcode值

Read指令,所以Qpcode = 0x02

3.2  Param1值

Param1表示的是访问的区域,有三个区域Config、OTP和Data,分别对应的值为:0、1、2、

3.3  Param2值

Param2中的Block指明操作哪个block和要offset多少个地址。这里是要读取 word 0 的值,所以Block和offset都是0

所以Read Command数据包的样式如下:

Word Address

Count

Opcode
Param1
Param2(byte0)

Param2(byte1)

   CRC
0x03
0x07
0x02
0x00
0x00
0x00
2 byte

4、计算CRC的值
使用Atmel官方提供的库中的sha204c_calculate_crc()函数算出后面的CRC的值,
库下载地址:http://www.atmel.com/tools/CRYPTOAUTHENTICATIONATSHA204DEVELOPMENTLIBRARY.aspx
sha204c_calculate_crc函数在sha204_comm.c中

void sha204c_calculate_crc(uint8_t length, uint8_t *data, uint8_t *crc) ;
第一个参数:Count ~ Param2(byte1)的个数,总共5个
第二个参数:需要计算的数据起始地址,即Count的地址
第三个参数:写入crc数据的起始地址(算出来的值为:0x1e, 0x2d)

最终Read Command数据包格式如下:

Word Address

Count

Opcode
Param1
Param2(byte0)

Param2(byte1)

CRC1

CRC2

0x03
0x07
0x02
0x00
0x00
0x00
0x1e
0x2d

三、程序设计
        芯片在读写之前,需要进行唤醒。Datasheet中的描述如下:

我写的程序思路如下:
1、设备需要Wake up才能读写数据。
2、查看slave是否有响应,此时读出4个字节,值分别为:0x04 0x11 0x33 0x43
3、发送Read Command
4、读出数据

四、实验结果

五、程序

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>#define SHA204_WRITE   0x01
#define SHA204_READ    0x03struct my_i2c_msg {unsigned short addr;  /* slave address          */unsigned short flags;unsigned short len;       /* msg length             */unsigned char buf[64];        /* pointer to msg data          */
};static void sha204c_calculate_crc( unsigned char  length, unsigned char  *data, unsigned char  *crc)
{unsigned char counter;unsigned short crc_register = 0;unsigned short polynom = 0x8005;unsigned char  shift_register;unsigned char  data_bit, crc_bit;for (counter = 0; counter < length; counter++) {for (shift_register = 0x01; shift_register > 0x00; shift_register <<= 1) {data_bit = (data[counter] & shift_register) ? 1 : 0;crc_bit = crc_register >> 15;crc_register <<= 1;if (data_bit != crc_bit)crc_register ^= polynom;}}crc[0] = (unsigned char)(crc_register & 0x00FF);crc[1] = (unsigned char)(crc_register >> 8);
}struct my_i2c_msg packet;
int main()
{int fd;fd = open("/dev/sha204", O_RDWR);if(fd < 0){printf("sha204 open failed!");}//1.wake uppacket.addr = 0x00;packet.len = 1;packet.buf[0] = 0;ioctl(fd, SHA204_WRITE, &packet);usleep(2600);//2.read feedback bytes (4 bytes)packet.addr = 0xc8;packet.len = 4;ioctl(fd, SHA204_READ, &packet);printf("Feedback bytes: %x %x %x %x\n", packet.buf[0],packet.buf[1],packet.buf[2],packet.buf[3]);//3.send read commandpacket.addr = 0xc8;packet.len = 8;packet.buf[0] = 0x03; //0x03, 0x07, 0x02, 0x00, 0x00, 0x00packet.buf[1] = 0x07;packet.buf[2] = 0x02;packet.buf[3] = 0x00;packet.buf[4] = 0x00;packet.buf[5] = 0x00;sha204c_calculate_crc(5 ,&packet.buf[1],&packet.buf[6]);printf("Read command: %x %x %x %x %x %x %x %x\n", packet.buf[0],packet.buf[1],packet.buf[2],packet.buf[3],\packet.buf[4],packet.buf[5],packet.buf[6],packet.buf[7]);\                               ioctl(fd, SHA204_WRITE, &packet);usleep(3000);//4.read datapacket.addr = 0xc8;packet.len = 7;memset(packet.buf, 0, 7);ioctl(fd, SHA204_READ, &packet);printf("Reading Data: %x %x %x %x %x %x %x\n", packet.buf[0],packet.buf[1],packet.buf[2],packet.buf[3],\packet.buf[4],packet.buf[5],packet.buf[6]);close(fd);return 0;
}

加密芯片ATSHA204读序列号(Serial Number)相关推荐

  1. android获取ro._修改Android序列号(Serial Number)

    文档说明 本文档以SC806-CN-00-71(msm8909平台 Android7系统)为例,描述如何修改Android Serial Number. Serial Number说明 菜单 Abou ...

  2. Apple Mac OS X每日一技巧029:查询iPhone/iPad的序列号(Serial Number)和标识符(UDID/Identifier)...

    1.序列号比较好查,不用连电脑也可以,打开iOS设备的设置->通用->关于本机 里边就有 2.通过电脑查看的话可以打开iTunes,插上iOS设备,该设备的摘要里边有序列号,点击一下这一行 ...

  3. [FAQ10927][USB serial number客制化][系列6]:能否实现adb devices的序列号,usb serialnumber, cts device ID,SN一致?

    [DESCRIPTION] 能否实现adb devices的序列号,usb serial number, cts device ID,SN一致? [KEYWORD] adb devices, Seri ...

  4. libusb获取usb设备的idVendor(vid),idProduct(pid),以及Serial Number

    发表于2015/6/23 21:55:11  4594人阅读 最近在做关于usb设备的项目,用到了libusb,发现关于这个的函数库的介绍,讲解很少,下面仅仅是简单展示一些基本的使用方法,以备后用. ...

  5. delphi 2007 安装提示Invalid Serial Number 超强解决办法

     delphi 2007 安装提示Invalid Serial Number 超强解决办法 安装前提是你已经下载了Delphi 2007 for Win32的ISO. Delphi 2007根据不 ...

  6. ORA-03113: end-of-file on communication channel Process ID: 252 Session ID: 1 Serial number: 3

    进入字符界面: sqlplus  / as sysdba startup nomount; alter database mount; alter database open; 报如下错误: * ER ...

  7. IQ01/IQ02 Create/Change Material Serial Number BAPI

    In recent days in the project, there're some requirement on creating&changing Material Serial nu ...

  8. NDK 获取android的imei和serial number

    1,获取imei int setAndroidDeviceID(JNIEnv *env, jobject obj,jobject mContext) {if(mContext == 0){return ...

  9. uni-app获取设备序列号SERIAL

    uni-app获取设备序列号方法 Android 8.0以下:无需申请权限,可以通过Build.SERIAL获取到设备序列号 Android 8.0-Android 10:需要申请READ_PHONE ...

最新文章

  1. 假如曹操是一名程序员,会发生什么?
  2. 如何禁止端口的使用(有空我把步骤图补上)
  3. js输出php文件大小,前端js实现文件的断点续传 后端PHP文件接收
  4. [转]阮一峰:蒙特卡罗方法入门
  5. 中国移动2016年Web应用防火墙集采:绿盟、深信服中标
  6. Ruby on Rails 终极部署方案 nginx+mina+puma
  7. 【Canal】互联网背景下有哪些数据同步需求和解决方案?看完我知道了!!
  8. 每日小记2017.2.28
  9. leetcode题解151-翻转字符串里的单词
  10. 仿新浪邮件输入自动提示jQuery插件
  11. while在Java用法_Java中while循环用法
  12. onenote 实现不同端 秒同步
  13. 企业工程项目管理系统平台(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)
  14. chrome扩展——bilibili视频封面获取器
  15. 如何放大图片,教您三种方法!
  16. LibreCAD windows 编译
  17. 华为手机提示 系统发现xxx删除照片提示 如何不提示,且不保存在最近删除列表
  18. 用vue-cli创建项目后npm run serve 报错Component name “main“ should always be multi-word vue/multi-word-compo
  19. HTML相对定位与绝对定位
  20. 通过控制台输出各种颜色的字符——ANSIConsole、JANSI

热门文章

  1. 全球及中国千兆路由器行业市场规模调研及投资风险预测报告2022-2028年
  2. pom.xml中解决Provides transitive vulnerable dependency maven:org.yaml:snakeyaml:1.33警告
  3. 用Python控制摄像头拍照并发邮件
  4. OpenCV的cv::cvtColor()
  5. [模板] 二分图最大匹配
  6. java中如何反编译class文件
  7. 23个 Web 开发中的侧边栏菜单练习实例
  8. 【个人网站】个人网站搭建全过程
  9. Kubernetes 学习总结(35)—— Kubernetes 1.25 正式发布,多方面重大突破
  10. docker docker compose 云效流水线