找回密码
 立即注册
楼主: wuzhengmin

第一次:环境的创立 | 送实验箱

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:41
  • 最近打卡:2025-10-14 08:27:33
已绑定手机

2

主题

258

回帖

750

积分

高级会员

积分
750
发表于 3 小时前 | 显示全部楼层
实际上,我们的住函数有个缺陷:


我们尝试多读几次芯片的ID:

结果看下图:


截图202510140955366015.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:41
  • 最近打卡:2025-10-14 08:27:33
已绑定手机

2

主题

258

回帖

750

积分

高级会员

积分
750
发表于 3 小时前 | 显示全部楼层
  1. void main()                                        //程序开始运行的入口
  2. {
  3.         int dat = 0;                        //初始数值
  4.         sys_init();                                //USB功能+IO口初始化
  5.         usb_init();                                //usb库初始化
  6.         EUSB = 1;
  7.         Timer0_Init();                        //定时器0初始化
  8.         EA = 1;                                        //CPU开放中断,打开总中断。
  9.         while( DeviceState != DEVSTATE_CONFIGURED );
  10.         //SPI_Init();   //SPI初始化
  11.        
  12.         while(1)                //死循环
  13.         {
  14.                 u8  ID;
  15.                
  16.                 delay_ms(2);
  17.                 if( bUsbOutReady )                //单片机每接受到一次数据,就打印一次存储芯片的ID号回来串口                                                       
  18.                 {
  19. //                        USB_SendData(UsbOutBuffer,OutNumber);
  20.                         usb_OUT_done();
  21.                         SPI_Init();   //SPI初始化
  22.                         CS = 0;
  23.                        
  24.                         SPI_WriteByte(0xAB);   //写入一个字节,0xAB命令,读取芯片ID
  25.                        
  26.                         SPI_WriteByte(0x00);   //写入一个字节,空命令,读取芯片ID
  27.                         SPI_WriteByte(0x00);   //写入一个字节,空命令,读取芯片ID
  28.                         SPI_WriteByte(0x00);   //写入一个字节,空命令,读取芯片ID
  29.                        
  30.                         ID = SPI_RearByte();   //读取一个字节
  31.                        
  32.                         CS = 1 ;
  33.                        
  34.                         printf("本芯片的ID: %u\r\n", (u16)ID);  //ID是无符号的8位变量 %u 对应u16,这是10进制打印
  35.                         printf("本芯片的ID: %x\r\n", (u16)ID);  //ID是无符号的8位变量 %u 对应u16,这是16进制打印
  36.                        
  37.                 }
  38.                 if( TIM_10MS_Flag==1 )                                                                        //如果10ms到了
  39.                 {
  40.                         TIM_10MS_Flag = 0;                                                                        //清空标志位       
  41.                 }
  42.                
  43. //研究SPI时序图可知,SPI初始化结束后,往从机里发0xAB指令,接着发3个任意空指令,
  44. //接着马上在D0上读取一个字节,这个字节就是芯片的ID
  45.                
  46.                        
  47.         }
  48. }
复制代码

是不是发现出差啦?‘

其实主要的初始化问题:

我们把主函数改一下:
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:41
  • 最近打卡:2025-10-14 08:27:33
已绑定手机

2

主题

258

回帖

750

积分

高级会员

积分
750
发表于 3 小时前 | 显示全部楼层
我发现每次读取之前,一定要重新初始化一次,才能正确的得到ID号:
SPI_Init();   //SPI初始化

看运行结果:





这样就能多次读取,每次都读对
截图202510141000109488.jpg
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-10-14 13:29 , Processed in 0.149624 second(s), 56 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表