找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8669|回复: 14
打印 上一主题 下一主题
收起左侧

STC8A8k64S4A12单片机例程

  [复制链接]
跳转到指定楼层
楼主
  1. #include "all.h"

  2. uchar xdata W25X16_Write_Buffer[256];//写入的数据
  3. uchar xdata W25X16_Read_Buffer[256];//读出的数据
  4. ////发送数据
  5. //uchar SPI_Flash_Send_Byte(uchar dat)
  6. //{
  7. // while(!(SPI_DIO&0x02));//等待发送缓冲区为空//SPI_SR=TXE位
  8. //         Flash_DO=dat;//将发送的数据送到数据寄存器
  9. //  while(!(SPI_DIO&0x01));//等待接收缓冲区非空//SPI_SR=RXNE位
  10. //                return SPI_DR;
  11. //}

  12. //向W25X16发送一个字节
  13. void SPI_Flash_Send_Reg(uchar dat)
  14. {
  15. uchar idata i;
  16.         _nop_();
  17.         _nop_();
  18.         Flash_SCLK=1;
  19.         _nop_();
  20.                 _nop_();
  21.         for(i=0;i<8;i++)
  22.         {
  23.          Flash_SCLK=0;
  24.                 _nop_();
  25.                 _nop_();
  26.         Flash_DIO=(bit)(dat&0x80);//先传送高位
  27.                 _nop_();
  28.                 _nop_();
  29.         Flash_SCLK=1;//上升沿输入数据
  30.                 _nop_();
  31.                 _nop_();
  32.                 dat<<=1;
  33.         }
  34. }

  35. //向W25X16读一个字节
  36. uchar SPI_Flash_Read_Data()
  37. {
  38. uchar idata i;
  39. uchar idata dat;
  40.         _nop_();
  41.                 _nop_();
  42.         Flash_SCLK=1;
  43. //        _NOP_();
  44. //        _NOP_();
  45.         for(i=0,dat=0;i<8;i++)
  46.         {
  47.          Flash_SCLK=0;
  48.                 _nop_();
  49.                 _nop_();
  50.                 dat<<=1;//高位
  51.         if(Flash_DO)//如果高位为1
  52.                 dat|=0x01;
  53.         Flash_SCLK=1;//一个上升沿读一次
  54.                 _nop_();
  55.                 _nop_();
  56.         }
  57.         return dat;
  58. }

  59. //1、写使能
  60. void SPI_Flash_Write_Enable()
  61. {
  62.   Flash_CS=0;//拉低选中芯片
  63.         SPI_Flash_Send_Reg(0x06);//
  64.         Flash_CS=1;//拉高不选中芯片
  65. }

  66. ////2.写禁止指令
  67. //void SPI_Flash_Write_Forbid()
  68. //{
  69. //  Flash_CS=0;//拉低选中芯片
  70. //        SPI_Flash_Send_Reg(0x04);//
  71. //        Flash_CS=1;//拉高不选中芯片
  72. //}

  73. //3.读状态寄存器//测试擦除是否完成
  74. void SPI_Flash_Read_Status()
  75. {
  76.         uchar Flash_statue=0;//状态寄存器值变量
  77.   Flash_CS=0;//拉低选中芯片
  78.         SPI_Flash_Send_Reg(0x05);//
  79.         do
  80.         {
  81.         //Flash_statue=SPI_Send_byte(0xff);//
  82.                 Flash_statue=SPI_Flash_Read_Data();//
  83.         }
  84.         while(Flash_statue&0x01);//等待芯片非忙绿状态

  85.   Flash_CS=1;  //拉高不选中芯片       
  86.        
  87.        
  88. }

  89. ////4.写状态寄存器指令
  90. //void SPI_Flash_Write_Status()
  91. //{

  92. //  Flash_CS=0;//拉低选中芯片
  93. //        SPI_Flash_Write_Enable();//使能
  94. //        SPI_Flash_Send_Reg(0x01);//
  95. //        SPI_Flash_Send_Reg(0x00);//写入状态的数据
  96. //        //通过写入的状态的值可以把芯片的部分或全部设置成只读
  97. //        //
  98. //  Flash_CS=1;//拉高不选中芯片       
  99. //}


  100. //5.读数据指令
  101. void SPI_Flash_Read_Byte(uchar *pBuffer,ulong ReadAddr,uint NumRead)
  102. {
  103. Flash_CS=0;//拉低选中芯片
  104.         SPI_Flash_Send_Reg(0x03);//
  105.         //24位地址
  106.         SPI_Flash_Send_Reg((ReadAddr&0xff0000)>>16);//先发送高8位
  107.         SPI_Flash_Send_Reg((ReadAddr&0xff00)>>8);//再发送中间8位
  108.         SPI_Flash_Send_Reg(ReadAddr&0xff);//低8位
  109.        
  110.         while(NumRead--)
  111.         {
  112.          *pBuffer=SPI_Flash_Read_Data();//读一个字节的数据
  113.                 pBuffer++;//指向下一个要读取的地址
  114.         }
  115.        
  116.         Flash_CS=1;//拉高不选中芯片
  117. }

  118. ////6.快速读数据指令
  119. //void SPI_Flash_Fast_Read_Data(uchar *pBuffer,ulong *ReadAddr,uint NumRead)
  120. //{
  121. //  Flash_CS=0;//拉低选中芯片
  122. //        SPI_Flash_Send_Reg(0x0B);//
  123. //       
  124. //        SPI_Flash_Send_Reg((ReadAddr&0xff0000)>>16);先发送高8位
  125. //        SPI_Flash_Send_Reg((ReadAddr&0xff00)>>8);再发送中间8位
  126. //        SPI_Flash_Send_Reg(ReadAddr&0xff);低8位
  127. //       
  128. //        SPI_Flash_Send_Reg(0xff);//等待8个时钟
  129. //       
  130. //        while(NumRead--)
  131. //        {
  132. //         *pBuffer=SPI_Flash_Read_Data();//读一个字节的数据
  133. //                pBuffer++;//指向下一个要读取的地址
  134. //        }
  135. //       
  136. //        Flash_CS=1;//拉高不选中芯片
  137. //}

  138. ////7.快速读双输出数据指令
  139. ////双读数据的读取函数
  140. //uchar SPI_Flash_Fast_Read_Data()
  141. //{
  142. //        uchar idata i;
  143. //  uchar idata dat=0;
  144. //       
  145. //        //双读
  146. //        for(i=0;i<4;i++)
  147. //        {
  148. //                //读取DO 的数据
  149. //         Flash_SCLK=1;
  150. //        _NOP_();
  151. //        _NOP_();
  152. //                dat<<=1;//高位
  153. //        if(Flash_DO)//如果高位为1
  154. //                dat|=0x01;
  155. //        Flash_SCLK=0;//下降沿
  156. //                _NOP_();
  157. //        _NOP_();       
  158. //        //读取DIO的数据
  159. //                dat<<=1;//高位
  160. //        if(Flash_DIO)//如果高位为1
  161. //                dat|=0x01;
  162. //        Flash_SCLK=1;//上升沿
  163. //                _NOP_();
  164. //        _NOP_();       
  165. //        }
  166. //}
  167. //void SPI_Flash_Fast_Two_Read_Data(uchar *pBuffer,ulong *ReadAddr,uint NumRead)
  168. //{

  169. //  Flash_CS=0;//拉低选中芯片
  170. //        SPI_Flash_Send_Reg(0x3B);//
  171. //       
  172. //        SPI_Flash_Send_Reg((ReadAddr&0xff0000)>>16);先发送高8位
  173. //        SPI_Flash_Send_Reg((ReadAddr&0xff00)>>8);再发送中间8位
  174. //        SPI_Flash_Send_Reg(ReadAddr&0xff);低8位
  175. //       
  176. //        SPI_Flash_Send_Reg(0xff);//等待8个时钟

  177. //        while(NumRead--)
  178. //        {
  179. //         *pBuffer=SPI_Flash_Fast_Read_Data();//读一个字节的数据
  180. //                pBuffer++;//指向下一个要读取的地址
  181. //        }
  182. //       
  183. //        Flash_CS=1;//拉高不选中芯片
  184. //}
  185. //8.页编程指令
  186. void SPI_Flash_Write_Page(uchar *pBuffer,ulong WriteAddr,uint NumWrite)
  187. {
  188.         SPI_Flash_Write_Enable();//先使能对芯片的操作
  189. Flash_CS=0;//拉低选中芯片
  190.         SPI_Flash_Send_Reg(0x02);//
  191.        
  192.         SPI_Flash_Send_Reg((WriteAddr&0xff0000)>>16);//先发送高8位
  193.         SPI_Flash_Send_Reg((WriteAddr&0xff00)>>8);//再发送中间8位
  194.         SPI_Flash_Send_Reg(WriteAddr&0xff);//低8位
  195.        
  196.         while(NumWrite--)
  197.         {
  198.          SPI_Flash_Send_Reg(*pBuffer);//发送欲写入flash的数据
  199.                 pBuffer++;//指向下一个要写入的地址
  200.         }
  201.         Flash_CS=1;//拉高不选中芯片
  202.         SPI_Flash_Read_Status();//等待写操作结束
  203. }

  204. ////页地址不对齐
  205. //void SPI_Flash_Write_Addr(uchar *pBuffer,ulong WriteAddr,uint NumWrite)
  206. //{
  207. // uchar Numofpage=0,Numofsingle=0,addr=0,count=0,time=0;//剩下的
  208. //        addr=WriteAddr%256;//判断要写入的地址是否页对齐
  209. //        count=256-addr;//剩下的地址
  210. //        Numofpage=NumWrite/256;//一共写多少整页
  211. //        Numofsingle=NumWrite%256;//还剩多少字节
  212. //       
  213. //        if(addr==0)//判断写入的地址是否页对齐
  214. //        {
  215. //          if(Numofpage===0)//如果只需写一页
  216. //                {
  217. //                  SPI_Flash_Write_Page(pBuffer,WriteAddr,NumWrite);
  218. //                }
  219. //                else//不止写一页
  220. //                {
  221. //                  while(Numofpage--)
  222. //                        {
  223. //                          SPI_Flash_Write_Page(pBuffer,WriteAddr,256);
  224. //                                WriteAddr+=256;//换下一页
  225. //                                pBuffer+=256;
  226. //                        }
  227. //                        SPI_Flash_Write_Page(pBuffer,WriteAddr,Numofsingle);//把剩下的字节写完
  228. //                }
  229. //        else //要写入的地址不是页对齐的地址
  230. //        {
  231. //          if(Numofpage==0)//只需要写一页
  232. //                {
  233. //                  if(count<Numofsingle)//判断要剩下的地址如果不够写字节
  234. //                        {
  235. //                         temp=Numofsingle-count;//还剩下的字节
  236. //                        SPI_Flash_Write_Page(pBuffer,WriteAddr,count);//写满一页
  237. //                                WriteAddr+=count;//换下一页
  238. //                                pBuffer+=count;
  239. //                                SPI_Flash_Write_Page(pBuffer,WriteAddr,temp);//往新的一页里写剩下的数据
  240. //                        }
  241. //                        else//剩下的地址够写字节
  242. //                        {
  243. //                         SPI_Flash_Write_Page(pBuffer,WriteAddr,NumWrite);
  244. //                        }       
  245. //                }
  246. //                else//不止写一页
  247. //                {
  248. //                  NumWrite-=count;//先把空的地址填满之后还剩的字节
  249. //                        Numofpage=NumWrite/256;//总共还要写多少页
  250. //                        Numofsingle=NumWrite%256;//还剩下的字节数
  251. //                        SPI_Flash_Write_Page(pBuffer,WriteAddr,count);//把空的地址填满
  252. //                        WriteAddr+=count;//换下一页
  253. //                                pBuffer+=count;
  254. //                        while(Numofpage--)//整页
  255. //                        {
  256. //                          SPI_Flash_Write_Page(pBuffer,WriteAddr,256);
  257. //                                WriteAddr+=256;//换下一页
  258. //                                pBuffer+=256;
  259. //                        }
  260. //                        if(Numofsingle!=0)
  261. //                        {
  262. //                          SPI_Flash_Write_Page(pBuffer,WriteAddr,Numofsingle);//把剩下的写完
  263. //                        }
  264. //                }       
  265. //         }
  266. //        }
  267. //}

  268. ////9.块擦除指令(64KB)256页
  269. //void SPI_Flash_Block_Erase(ulong BlockAddr)
  270. //{
  271. //  SPI_Flash_Write_Enable();//写使能
  272. //        Flash_CS=0;//拉低选中芯片
  273. //        SPI_Flash_Send_Reg(0xD8);//
  274. //       
  275. //        SPI_Flash_Send_Reg((BlockAddr&0xff0000)>>16);先发送高8位
  276. //        SPI_Flash_Send_Reg((BlockAddr&0xff00)>>8);再发送中间8位
  277. //        SPI_Flash_Send_Reg(BlockAddr&0xff);低8位
  278. //       
  279. //        Flash_CS=1;//拉高不选中芯片
  280. //        SPI_Flash_Read_Status();//等待块清除操作完成
  281. //}

  282. //10.扇区擦除(4KB)16页
  283. void SPI_Flash_Section_Erase(ulong SectionAddr)
  284. {
  285.   SPI_Flash_Write_Enable();//写使能
  286.         Flash_CS=0;//拉低选中芯片
  287.         SPI_Flash_Send_Reg(0x20);//
  288.        
  289.         SPI_Flash_Send_Reg((SectionAddr&0xff0000)>>16);//先发送高8位
  290.         SPI_Flash_Send_Reg((SectionAddr&0xff00)>>8);//再发送中间8位
  291.         SPI_Flash_Send_Reg(SectionAddr&0xff);//低8位
  292.        
  293.         Flash_CS=1;//拉高不选中芯片
  294.         SPI_Flash_Read_Status();//等待扇区操作完成
  295. }

  296. ////11.芯片擦除指令
  297. //void SPI_Flash_Chip_Erase()
  298. //{
  299. // SPI_Flash_Write_Enable();//写使能
  300. //        Flash_CS=0;//拉低选中芯片
  301. //        SPI_Flash_Send_Reg(0xc7);//
  302. //        Flash_CS=1;//拉高不选中芯片
  303. //        SPI_Flash_Read_Status();//等待块清除操作完成
  304. //}

  305. ////12.芯片掉电命令
  306. //void SPI_Flash_Power-Fail()
  307. //{
  308. //        Flash_CS=0;//拉低选中芯片
  309. //        SPI_Flash_Send_Reg(0xB9);//
  310. //        Flash_CS=1;//拉高不选中芯片
  311. //        SPI_Flash_Read_Status();//等待块清除操作完成
  312. //}


  313. //13.芯片掉电释放/器件ID命令
  314. //14.芯片制造商/器件ID命令
  315. ////15.JEDEC ID序列指令
  316. //ulong SPI_Flash_Read_ID()
  317. //{
  318. //  ulong temp=0,temp1=0,temp2=0,temp3=0;//Flash暂存变量
  319. //        Flash_CS=0;//拉低选中芯片
  320. //        SPI_Flash_Send_Reg(0x9F);//
  321. //        SPI_Flash_Send_Reg(0xff);
  322. //        temp1=SPI_Flash_Read_Data();//从flash读取第一个字节数据
  323. //        SPI_Flash_Send_Reg(0xff);
  324. //        temp2=SPI_Flash_Read_Data();//从flash读取第一个字节数据
  325. //        SPI_Flash_Send_Reg(0xff);
  326. //        temp3=SPI_Flash_Read_Data();//从flash读取第一个字节数据
  327. //  Flash_CS=1;//拉高不选中芯片
  328. //        temp=(((temp1<<16)|temp2<<8)|temp3);//拼合数据组成ID序列
  329. //        return temp;//返回序列号
  330. //}
复制代码

本人大二新生,暑假期间写了一点点基本程序,开发版是STC8A8K的,我在初学期间发现在这个板子的资料比较少,学习起来不太方便。以下程序本人都亲自测试过,有个别没有搞明白的,本人也都做了标记,希望能给初学者一点帮助,另外欢迎大佬纠正错误,完善程序。

TIM图片20190825201502.png (40.74 KB, 下载次数: 64)

TIM图片20190825201502.png

TIM图片20190825201526.png (56.96 KB, 下载次数: 61)

TIM图片20190825201526.png

STC8A8K原理图.pdf

258.34 KB, 下载次数: 63, 下载积分: 黑币 -5

原理图

STC8手册-20180507.pdf

8.21 MB, 下载次数: 43, 下载积分: 黑币 -5

数据手册

stc8a8k单个程序.zip

1.01 MB, 下载次数: 175, 下载积分: 黑币 -5

单个程序

stc8a8k.zip

98.75 KB, 下载次数: 125, 下载积分: 黑币 -5

一个工程多个文件

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:535176 发表于 2019-9-3 12:54 | 只看该作者
怎么好的东西,怎么都没有人看到吗?
回复

使用道具 举报

板凳
ID:427492 发表于 2019-9-24 22:14 来自手机 | 只看该作者
你的SD卡,带文件系统吗
回复

使用道具 举报

地板
ID:371527 发表于 2019-9-26 11:20 | 只看该作者
看了,下载了,很好,
回复

使用道具 举报

5#
ID:371527 发表于 2019-9-26 11:21 | 只看该作者
我在用W25Q32
回复

使用道具 举报

6#
ID:371527 发表于 2019-9-26 11:22 | 只看该作者
再加上SD那个有文件系统的应用,更好,
回复

使用道具 举报

7#
ID:371527 发表于 2019-9-26 11:24 | 只看该作者
8a8k,我用时,其芯片总是出故障,烧坏ADC输入(加保护电阻了)看在AD精度还可以,就尽量采用
回复

使用道具 举报

8#
ID:371527 发表于 2019-9-26 11:27 | 只看该作者
其它的,就是怀疑该芯片在制造上还有缺陷,开发板三个月换个芯片,不是我电源就是他芯片在电源耐冲击上有问题,不知你有何经验?
回复

使用道具 举报

9#
ID:535176 发表于 2019-9-27 21:29 | 只看该作者
枫树566 发表于 2019-9-24 22:14
你的SD卡,带文件系统吗

这个还没搞好,不好意思啊,非常抱歉
回复

使用道具 举报

10#
ID:535176 发表于 2019-9-27 21:30 | 只看该作者
1113634577 发表于 2019-9-26 11:22
再加上SD那个有文件系统的应用,更好,

抱歉啊,还没搞好哈
回复

使用道具 举报

11#
ID:535176 发表于 2019-9-27 21:32 | 只看该作者
1113634577 发表于 2019-9-26 11:27
其它的,就是怀疑该芯片在制造上还有缺陷,开发板三个月换个芯片,不是我电源就是他芯片在电源耐冲击上有问 ...

芯片应该没问题吧,我的就正常使用,直接连接点电脑的USB,12V输出,
回复

使用道具 举报

12#
ID:613800 发表于 2019-9-28 16:31 | 只看该作者
楼主在吗?能加你qq请教下吗
回复

使用道具 举报

13#
ID:160834 发表于 2020-1-11 21:52 | 只看该作者
好资料
回复

使用道具 举报

14#
ID:954112 发表于 2021-11-4 17:25 | 只看该作者
为什么12864上面是STC15.h 不是STC8.H
回复

使用道具 举报

15#
ID:92810 发表于 2021-11-5 15:48 | 只看该作者
楼主为什么不打包一下呢
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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