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

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

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-10-15 15:37:36
已绑定手机

2

主题

271

回帖

782

积分

高级会员

积分
782
发表于 前天 09:55 | 显示全部楼层
实际上,我们的住函数有个缺陷:


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

结果看下图:


截图202510140955366015.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-10-15 15:37:36
已绑定手机

2

主题

271

回帖

782

积分

高级会员

积分
782
发表于 前天 09:58 | 显示全部楼层
  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
  • 打卡总天数:42
  • 最近打卡:2025-10-15 15:37:36
已绑定手机

2

主题

271

回帖

782

积分

高级会员

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

看运行结果:





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

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:28
  • 最近打卡:2025-10-15 09:14:39
已绑定手机

1

主题

51

回帖

293

积分

中级会员

积分
293
发表于 昨天 15:23 | 显示全部楼层
wuzhe*** 发表于 2025-8-12 10:04
为什么要搞不停电下载?就是要像STC89C52RC用在清翔C51实验板上那样,下载的时候不用按任何按键!

方便我 ...

楼主这个mdk背景配色 不敢恭维,感觉刺眼睛
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-10-15 15:37:36
已绑定手机

2

主题

271

回帖

782

积分

高级会员

积分
782
发表于 昨天 15:37 | 显示全部楼层
baocon*** 发表于 2025-10-15 15:23
楼主这个mdk背景配色 不敢恭维,感觉刺眼睛

是啊,我也在找好一点的啊,还没有找到啊
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-10-15 15:37:36
已绑定手机

2

主题

271

回帖

782

积分

高级会员

积分
782
发表于 昨天 15:42 | 显示全部楼层
今天我们继续学习   第二十八集:硬件SPI读写FLASH


其实这里容易产生似懂非懂的感觉:

1.SPI简介
SPI是串行外设接口(Serial Peripheral Interface)的缩写。SPI是一种高口速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。
这种接口,看上去好简单:

产生时钟的一侧称为主机,另一侧称为从机。同一时间只有一个主机,但是可以有多个从机。

SPI总线包括4条逻辑线,定义如下:

MISO:Master input slave output 主机输入,从机输出(数据来自从机);MOSI:Masteroutput slave input主机输出,从机输入(数据来自主机);SCLK:Serial Clock串行时钟信号,由主机产生发送给从机;SS Slave Select 片选信号,由主机发送以控制与哪个从机通信,通常是低电平有效信号


截图202510151541272235.jpg
截图202510151541486311.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-10-15 15:37:36
已绑定手机

2

主题

271

回帖

782

积分

高级会员

积分
782
发表于 昨天 15:45 | 显示全部楼层
多数是单主多从,由SS的电平决定每一时刻和谁通信

通信方式和主多从,看下图:



截图202510151545026279.jpg
截图202510151545233991.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-10-15 15:37:36
已绑定手机

2

主题

271

回帖

782

积分

高级会员

积分
782
发表于 昨天 15:47 | 显示全部楼层
SPI数据模式:
时钟极性(CKP/CPOL)
根据硬件制造商的命名规则不同,时钟极性通常写为CKP或CPOLCKOL可以配置为1或0。这意味着可以根据需要将时钟的默认状态(IDLE)设置为高或低。当然具体的配置必须参考设备的数据手册正确设置CKP=0:时钟空闲IDLE为低电平 0;CKP=.1:时钟空闲IDLE为高电平·1;
时钟相位(CKE/CPHA)

顾名思义,时钟相位/边沿,也就是采集数据时是在时钟信号的具体相位或者边沿;CPHA = 0:在时钟信号SCK的第一个跳变沿采样;CPHA= 1:在时钟信号SCK的第二个跳变沿采样;时钟极性和相位共同决定读取数据的方式,比如信号上升沿读取数据还是信号下降沿读取数据;




截图202510151546417285.jpg
截图202510151546563166.jpg
截图202510151547145339.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-10-15 15:37:36
已绑定手机

2

主题

271

回帖

782

积分

高级会员

积分
782
发表于 昨天 15:50 | 显示全部楼层
时钟极性控制和时钟相位控制:


下面是试验箱引脚硬件连接:


截图202510151549534874.jpg
截图202510151550391479.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-10-15 15:37:36
已绑定手机

2

主题

271

回帖

782

积分

高级会员

积分
782
发表于 昨天 15:53 | 显示全部楼层
1.硬件链接
CS:低电平有效
DI/DO:数据输入输出端
WP:低电平写保护
HOLD:低电平时暂停
CLK:时钟信号

有个问题要小心:

这个存储芯片是3.3V 我们STC32G12K128是5V

不同工作电源电压,要千万小心,很容易出问题的:

看图:



截图202510151553155318.jpg
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-16 07:58 , Processed in 0.128116 second(s), 91 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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