spi45db041.c
上传用户:zanguozi01
上传日期:2014-02-19
资源大小:155k
文件大小:15k
源码类别:

GPS编程

开发平台:

Others

  1. /********************************************************
  2. * 文件名:  SPI45DB041.C
  3. * 创建时间:2004年12月7日
  4. * 创建人:  
  5. * 版本号:  1.00
  6. * 功能:   实现针对串行FLASH,SPI45DB041的相关操作,读,写
  7. * 文件属性:公共文件
  8. * 修改历史:(每条详述)
  9. ********************************************************/
  10. #include <msp430x14x.h>
  11. #include "SPI45DB041.H"
  12. #define NOP() { _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); }
  13. void delay(unsigned int t);//时间延迟
  14. void SPI45D041_WriteBits(unsigned int byte,unsigned char num_of_bits);//写
  15. unsigned char SPI45D041_ReadByte(void);//一个字节的读取
  16. //void ReadOnePage(unsigned int PageAddress);//不通过两个缓冲而读Flash指定页的整个数据
  17. //void WriteOnePage(unsigned int PageAddress);//通过buffer1将一个页的数据写入Flash指定页中
  18. //void SI_To_Buffer1(void);  //写一个页的数据到buffer1中
  19. //void SO_From_Buffer1(void);//读取整个buffer1中的数据
  20. //unsigned char SPI_Flash_Buffer[256];
  21. //void ReadOnePageToBuffer1(unsigned int PageAddress);//读主存储区一个页的数据到buffer1
  22. //void ReadOnePageToBuffer2(unsigned int PageAddress);//读主存储区一个页的数据到buffer2
  23. //unsigned char ReadByteFromBuffer1(unsigned int ByteAddress); //读buffer1中的一个指定地址的字节
  24. //unsigned char ReadByteFromBuffer2(unsigned int ByteAddress); //读buffer2中的一个指定地址的字节
  25. //unsigned char ReadNextFromBuffer1(void);//读buffer1中的下一个地址的字节数据
  26. //unsigned char ReadNextFromBuffer2(void);//读buffer2中的下一个地址的字节数据
  27. //void WriteOneByteToBuffer1(unsigned int ByteAddress,unsigned char WriteOneByte );//在buffer1中的一个指定的地址写一个字节
  28. //void WriteOneByteToBuffer2(unsigned int ByteAddress,unsigned char WriteOneByte );//在buffer2中的一个指定的地址写一个字节
  29. //void WriteNextByteToBuffer1(unsigned char WriteNextOne);//写buffer1中的下一个地址
  30. //void WriteNextByteToBuffer2(unsigned char WriteNextOne);//写buffer2中的下一个地址
  31. //void WriteBuffer1ToPage(unsigned int PageAddress);//将buffer1中的数据写入主存储区一个指定的页
  32. //void WriteBuffer2ToPage(unsigned int PageAddress);//将buffer2中的数据写入主存储区一个指定的页
  33. //void OperateSPIEnd(void);
  34. /********************************************************
  35. * 函数名:delay
  36. 作用域:本文件调用
  37. * 功能:  时间延迟
  38. * 参数:  t
  39. * 返回值:无
  40. * 创建人:
  41. *
  42. * 修改历史:(每条详述)
  43. ********************************************************/
  44. void delay(unsigned int t)
  45. {
  46. while(t--){};
  47. }
  48. /********************************************************
  49. * 函数名:SPI45D041_WriteBits
  50. 作用域:本文件调用
  51. * 功能:  对一个int型的数据(16位)依次右移,并放在FLASH的输入脚上
  52. * 参数:  byte  一个int的数
  53. num_of_bits 针对上面的int型的数据,依次向右移出的bit数
  54. * 返回值:无
  55. * 创建人:
  56. *
  57. * 修改历史:(每条详述)
  58. SPI_SCK上升沿数据有效
  59. 针对bit的数据操作:通过SI口,写入一个字节的多少bit
  60. ********************************************************/
  61. void SPI45D041_WriteBits(unsigned int byte,unsigned char num_of_bits)
  62. {
  63. unsigned char count;
  64. unsigned int Temp;
  65. byte=byte<<(16-num_of_bits);
  66. for(count=0;count<num_of_bits;count++)
  67. {
  68. Temp=byte&0x8000;
  69. P2OUT&=~SPI45DB041_SCK;
  70. NOP();
  71. if(Temp==0x8000)
  72. {
  73. P2OUT|=SPI45DB041_SI;
  74. }
  75. else
  76. {
  77. P2OUT&=~SPI45DB041_SI;
  78. }
  79. P2OUT|=SPI45DB041_SCK;
  80. NOP();
  81. byte<<=1;
  82. }
  83. }
  84. /********************************************************
  85. * 函数名:SPI45D041_ReadByte
  86. 作用域:本文件调用
  87. * 功能:  SPI_SCK下降沿数据有效,读一个字节数据
  88. * 参数:  无
  89. * 返回值:byte 从FLASH中读取的一个字节
  90. * 创建人:
  91. *
  92. * 修改历史:(每条详述)
  93. ********************************************************/
  94. unsigned char SPI45D041_ReadByte(void)
  95. {
  96. unsigned char count,byte;
  97. for(count=0;count<8;count++)
  98. {
  99. P2OUT|=SPI45DB041_SCK;
  100. NOP();
  101. byte<<=1;
  102. P2OUT&=~SPI45DB041_SCK;
  103. NOP();
  104. if(P2IN&SPI45DB041_SO) byte++;
  105. NOP();
  106. }
  107. return(byte);
  108. }
  109. /********************************************************
  110. * 函数名:ReadOnePage
  111. 作用域:此文件在此项目中不使用
  112. * 功能:  Main Memory的一个页的读操作:不通过两个buffer,直接读取主存储区一个页的数据
  113. * 参数:
  114. * 返回值:
  115. * 创建人:
  116. *
  117. * 修改历史:(每条详述)
  118. ********************************************************/
  119. /*
  120. void ReadOnePage(unsigned int PageAddress)
  121. {
  122. unsigned int i;
  123. P2OUT|=SPI45DB041_SCK;
  124. NOP();
  125. P2OUT&=~SPI45DB041_CS;
  126. NOP();
  127. SPI45D041_WriteBits(0x52,8);        //送8 bit 的命令字
  128. SPI45D041_WriteBits(0x00,4);        //送4 bit 的保留位
  129. SPI45D041_WriteBits(PageAddress,11);//送11位的页地址
  130. SPI45D041_WriteBits(0x00,9);        //送9位的页内地址
  131. SPI45D041_WriteBits(0x00,16);
  132. SPI45D041_WriteBits(0x00,16);       //送32位的NOP操作
  133. NOP();
  134. for(i=0;i<256;i++)
  135. {
  136.    // SPI_Flash_Buffer[i]=SPI45D041_ReadByte();
  137. }
  138. NOP();
  139. P2OUT|=SPI45DB041_CS;
  140. }
  141. */
  142. /********************************************************
  143. * 函数名:SI_To_Buffer1
  144. 作用域:此文件在此项目中不使用
  145. * 功能:  SI 数据写到buffer1中:直接写一个页的数据在buffer1中。
  146. * 参数:
  147. * 返回值:
  148. * 创建人:
  149. *
  150. * 修改历史:(每条详述)
  151. ********************************************************/
  152. /*
  153. void SI_To_Buffer1(void)
  154. {
  155. unsigned int i;
  156. P2OUT|=SPI45DB041_SCK;
  157. NOP();
  158. P2OUT&=~SPI45DB041_CS;
  159. NOP();
  160. SPI45D041_WriteBits(0x84,8);        //送8 bit 的命令字
  161. SPI45D041_WriteBits(0x00,15);       //送15 bit 的NOP
  162. SPI45D041_WriteBits(0x00,9);        //送9 bit 的页内地址
  163. for(i=0;i<256;i++)
  164. {
  165. // SPI45D041_WriteBits(SPI_Flash_Buffer[i],8);
  166. }
  167. NOP();
  168. P2OUT|=SPI45DB041_CS;
  169. NOP();
  170. }
  171. */
  172. /********************************************************
  173. * 函数名:SO_From_Buffer1
  174. 作用域:此文件在此项目中不使用
  175. * 功能:  读取整个Buffer1中的数据
  176. * 参数:
  177. * 返回值:
  178. * 创建人:
  179. *
  180. * 修改历史:(每条详述)
  181. ********************************************************/
  182. /*
  183. void SO_From_Buffer1(void)
  184. {
  185. unsigned int i;
  186. P2OUT|=SPI45DB041_SCK;
  187. NOP();
  188. P2OUT&=~SPI45DB041_CS;
  189. NOP();
  190. SPI45D041_WriteBits(0x54,8);        //送8 bit 的命令字
  191. SPI45D041_WriteBits(0x00,15);       //送15 bit 的NOP
  192. SPI45D041_WriteBits(0x00,9);        //送9 bit 的页内地址
  193. SPI45D041_WriteBits(0x00,8);       //送8bit 的NOP
  194. NOP();
  195. for(i=0;i<256;i++)
  196. {
  197. //     SPI_Flash_Buffer[i]=SPI45D041_ReadByte();
  198. }
  199. NOP();
  200. P2OUT|=SPI45DB041_CS;
  201. }
  202. */
  203. /********************************************************
  204. * 函数名:WriteOnePage
  205. 作用域:此文件在此项目中不使用
  206. * 功能:  Main Memory的一个页的写操作:通过buffer1将一个页的数据写入主存储区的一个指定的页中。
  207. * 参数:
  208. * 返回值:
  209. * 创建人:
  210. *
  211. * 修改历史:(每条详述)
  212. ********************************************************/
  213. /*
  214. void WriteOnePage(unsigned int PageAddress)
  215. {
  216. SI_To_Buffer1();                    //先将数据写到Buffer1中
  217. P2OUT|=SPI45DB041_SCK;
  218. NOP();
  219. P2OUT&=~SPI45DB041_CS;
  220. NOP();
  221. SPI45D041_WriteBits(0x83,8);        //送8 bit 的命令字
  222. SPI45D041_WriteBits(0x00,4);        //送4 bit 的保留位
  223. SPI45D041_WriteBits(PageAddress,11);//送11 bit 的页地址
  224.     SPI45D041_WriteBits(0x00,9);        //送9 bit 的NOP
  225.     P2OUT|=SPI45DB041_CS;
  226.     NOP();
  227.     delay(80000);
  228. }
  229. */
  230. /********************************************************
  231. * 函数名:ReadOnePageToBuffer1
  232. 作用域:外部文件调用
  233. * 功能:  读主存储区一个页的数据到buffer1。
  234. * 参数:  PageAddress 需要读的主存储区的页地址
  235. * 返回值:无
  236. * 创建人:
  237. *
  238. * 修改历史:(每条详述)
  239. ********************************************************/
  240. /*
  241. void ReadOnePageToBuffer1(unsigned int PageAddress)
  242. {
  243. P2OUT|=SPI45DB041_SCK;
  244. NOP();
  245. P2OUT&=~SPI45DB041_CS;
  246. NOP();
  247. SPI45D041_WriteBits(0x53,8);        //送8 bit 的命令字
  248. SPI45D041_WriteBits(0x00,4);        //送4 bit 的保留位
  249. SPI45D041_WriteBits(PageAddress,11);//送11位的页地址
  250. SPI45D041_WriteBits(0x00,9);        //送9位的页内地址
  251. P2OUT|=SPI45DB041_CS;
  252. NOP();
  253. delay(10000);
  254. }
  255. */
  256. /********************************************************
  257. * 函数名:ReadOnePageToBuffer2
  258. 作用域:外部文件调用
  259. * 功能:  读主存储区一个页的数据到buffer2
  260. * 参数:  PageAddress 需要读的主存储区的页地址
  261. * 返回值:无
  262. * 创建人:
  263. *
  264. * 修改历史:(每条详述)
  265. ********************************************************/
  266. void ReadOnePageToBuffer2(unsigned int PageAddress)
  267. {
  268. P2OUT|=SPI45DB041_SCK;
  269. NOP();
  270. P2OUT&=~SPI45DB041_CS;
  271. NOP();
  272. SPI45D041_WriteBits(0x55,8);        //送8 bit 的命令字
  273. SPI45D041_WriteBits(0x00,4);        //送4 bit 的保留位
  274. SPI45D041_WriteBits(PageAddress,11);//送11位的页地址
  275. SPI45D041_WriteBits(0x00,9);        //送9位的页内地址
  276. P2OUT|=SPI45DB041_CS;
  277. NOP();
  278. delay(10000);
  279. }
  280. /********************************************************
  281. * 函数名:ReadByteFromBuffer1
  282. 作用域:外部文件调用
  283. * 功能:  在buffer1中的一个指定地址读一个字节的数据
  284. * 参数:  ByteAddress 指定字节在页内的地址
  285. * 返回值:
  286. * 创建人:
  287. *
  288. * 修改历史:(每条详述)
  289. ********************************************************/
  290. /*
  291. unsigned char ReadByteFromBuffer1(unsigned int ByteAddress)
  292. {
  293. unsigned char Buffer1OneByte;
  294. P2OUT|=SPI45DB041_SCK;
  295. NOP();
  296. P2OUT&=~SPI45DB041_CS;
  297. NOP();
  298. SPI45D041_WriteBits(0x54,8);        //送8 bit 的命令字
  299. SPI45D041_WriteBits(0x00,15);       //送15 bit 的保留位
  300. SPI45D041_WriteBits(ByteAddress,9);//送11位的页地址
  301. SPI45D041_WriteBits(0x00,8);        //送8 bit 的保留位
  302. NOP();
  303. Buffer1OneByte=SPI45D041_ReadByte();
  304. return(Buffer1OneByte);
  305. }
  306. */
  307. /********************************************************
  308. * 函数名:ReadNextFromBuffer1
  309. 作用域:外部文件调用
  310. * 功能:  读buffer1中的下一个地址的字节数据(配合的与ReadByteBuffer1一起使用)
  311. * 参数: 无
  312. * 返回值:Buffer1NextByte
  313. * 创建人:
  314. *
  315. * 修改历史:(每条详述)
  316. ********************************************************/
  317. /*
  318. unsigned char ReadNextFromBuffer1(void)
  319. {
  320. unsigned char Buffer1NextByte;
  321. Buffer1NextByte=SPI45D041_ReadByte();
  322. return(Buffer1NextByte);
  323. }
  324. */
  325. /********************************************************
  326. * 函数名:ReadByteFromBuffer2
  327. 作用域:外部文件调用
  328. * 功能: 在buffer2中的一个指定地址读一个字节的数据
  329. * 参数:
  330. * 返回值:
  331. * 创建人:
  332. *
  333. * 修改历史:(每条详述)
  334. ********************************************************/
  335. unsigned char ReadByteFromBuffer2(unsigned int ByteAddress)
  336. {
  337. unsigned char Buffer2OneByte;
  338. P2OUT|=SPI45DB041_SCK;
  339. NOP();
  340. P2OUT&=~SPI45DB041_CS;
  341. NOP();
  342. SPI45D041_WriteBits(0x56,8);        //送8 bit 的命令字
  343. SPI45D041_WriteBits(0x00,15);       //送15 bit 的保留位
  344. SPI45D041_WriteBits(ByteAddress,9); //送11位的页地址
  345. SPI45D041_WriteBits(0x00,8);        //送8 bit 的保留位
  346. NOP();
  347. Buffer2OneByte=SPI45D041_ReadByte();
  348. return(Buffer2OneByte);
  349. }
  350. /********************************************************
  351. * 函数名:ReadNextFromBuffer2
  352. 作用域:外部文件调用
  353. * 功能: 读buffer2中的下一个地址的字节数据(配合的与ReadByteBuffer2一起使用)
  354. * 参数:
  355. * 返回值:
  356. * 创建人:
  357. *
  358. * 修改历史:(每条详述)
  359. ********************************************************/
  360. unsigned char ReadNextFromBuffer2(void)
  361. {
  362. unsigned char Buffer2NextByte;
  363. Buffer2NextByte=SPI45D041_ReadByte();
  364. return(Buffer2NextByte);
  365. }
  366. /********************************************************
  367. * 函数名:WriteOneByteToBuffer1
  368. 作用域:外部文件调用
  369. * 功能: 在buffer1中的一个指定的地址写一个字节
  370. * 参数:
  371. * 返回值:
  372. * 创建人:
  373. *
  374. * 修改历史:(每条详述)
  375. ********************************************************/
  376. /*
  377. void WriteOneByteToBuffer1(unsigned int ByteAddress,unsigned char WriteOneByte )
  378. {
  379. P2OUT|=SPI45DB041_SCK;
  380. NOP();
  381. P2OUT&=~SPI45DB041_CS;
  382. NOP();
  383. SPI45D041_WriteBits(0x84,8);         //送8 bit 的命令字
  384. SPI45D041_WriteBits(0x00,15);        //送15 bit 的NOP
  385. SPI45D041_WriteBits(ByteAddress,9);  //送9 bit 的页内地址
  386. SPI45D041_WriteBits(WriteOneByte,8);
  387. NOP();
  388. }
  389. */
  390. /********************************************************
  391. * 函数名:WriteNextByteToBuffer1
  392. 作用域:外部文件调用
  393. * 功能: 写buffer1中的下一个地址(必须配合WriteOneByteToBuffer1一起使用)
  394. * 参数:
  395. * 返回值:
  396. * 创建人:
  397. *
  398. * 修改历史:(每条详述)
  399. ********************************************************/
  400. /*
  401. void WriteNextByteToBuffer1(unsigned char WriteNextOne)
  402. {
  403. SPI45D041_WriteBits(WriteNextOne,8);
  404. }
  405. */
  406. /********************************************************
  407. * 函数名:WriteOneByteToBuffer2
  408. 作用域:外部文件调用
  409. * 功能: 在buffer2中的一个指定的地址写一个字节
  410. * 参数:
  411. * 返回值:
  412. * 创建人:
  413. *
  414. * 修改历史:(每条详述)
  415. ********************************************************/
  416. void WriteOneByteToBuffer2(unsigned int ByteAddress,unsigned char WriteOneByte )
  417. {
  418. P2OUT|=SPI45DB041_SCK;
  419. NOP();
  420. P2OUT&=~SPI45DB041_CS;
  421. NOP();
  422. SPI45D041_WriteBits(0x87,8);         //送8 bit 的命令字
  423. SPI45D041_WriteBits(0x00,15);        //送15 bit 的NOP
  424. SPI45D041_WriteBits(ByteAddress,9);  //送9 bit 的页内地址
  425. SPI45D041_WriteBits(WriteOneByte,8);
  426. NOP();
  427. }
  428. /********************************************************
  429. * 函数名:WriteNextByteToBuffer2
  430. 作用域:外部文件调用
  431. * 功能: 写buffer2中的下一个地址(必须配合WriteOneByteToBuffer2一起使用)
  432. * 参数:
  433. * 返回值:
  434. * 创建人:
  435. *
  436. * 修改历史:(每条详述)
  437. ********************************************************/
  438. void WriteNextByteToBuffer2(unsigned char WriteNextOne)
  439. {
  440. SPI45D041_WriteBits(WriteNextOne,8);
  441. }
  442. /********************************************************
  443. * 函数名:WriteBuffer1ToPage
  444. 作用域:外部文件调用
  445. * 功能: 将buffer1中的数据写入主存储区一个指定的页,前提条件是buffer1中确定是需要写入的数据
  446. * 参数:
  447. * 返回值:
  448. * 创建人:
  449. *
  450. * 修改历史:(每条详述)
  451. ********************************************************/
  452. /*
  453. void WriteBuffer1ToPage(unsigned int PageAddress)
  454. {
  455. P2OUT|=SPI45DB041_SCK;
  456. NOP();
  457. P2OUT&=~SPI45DB041_CS;
  458. NOP();
  459. SPI45D041_WriteBits(0x83,8);        //送8 bit 的命令字
  460. SPI45D041_WriteBits(0x00,4);        //送4 bit 的保留位
  461. SPI45D041_WriteBits(PageAddress,11);//送11 bit 的页地址
  462.     SPI45D041_WriteBits(0x00,9);        //送9 bit 的NOP
  463.     P2OUT|=SPI45DB041_CS;
  464.     NOP();
  465.     delay(100000);
  466. }
  467. */
  468. /********************************************************
  469. * 函数名:WriteBuffer2ToPage
  470. 作用域:外部文件调用
  471. * 功能: 将buffer2中的数据写入主存储区一个指定的页,前提条件是buffer2中确定是需要写入的数据
  472. * 参数:
  473. * 返回值:
  474. * 创建人:
  475. *
  476. * 修改历史:(每条详述)
  477. ********************************************************/
  478. void WriteBuffer2ToPage(unsigned int PageAddress)
  479. {
  480. P2OUT|=SPI45DB041_SCK;
  481. NOP();
  482. P2OUT&=~SPI45DB041_CS;
  483. NOP();
  484. SPI45D041_WriteBits(0x86,8);        //送8 bit 的命令字
  485. SPI45D041_WriteBits(0x00,4);        //送4 bit 的保留位
  486. SPI45D041_WriteBits(PageAddress,11);//送11 bit 的页地址
  487.     SPI45D041_WriteBits(0x00,9);        //送9 bit 的NOP
  488.     P2OUT|=SPI45DB041_CS;
  489.     NOP();
  490.     delay(100000);
  491. }
  492. /********************************************************
  493. * 函数名:EraseOnePage
  494. 作用域:外部文件调用
  495. * 功能: 指定
  496. * 参数:
  497. * 返回值:
  498. * 创建人:
  499. *
  500. * 修改历史:(每条详述)
  501. ********************************************************/
  502. void EraseOnePage(unsigned int PageAddress)
  503. {
  504. P2OUT|=SPI45DB041_SCK;
  505. NOP();
  506. P2OUT&=~SPI45DB041_CS;
  507. NOP();
  508. SPI45D041_WriteBits(0x81,8);        //送8 bit 的命令字
  509. SPI45D041_WriteBits(0x00,4);        //送4 bit 的保留位
  510. SPI45D041_WriteBits(PageAddress,11);//送11 bit 的页地址
  511.     SPI45D041_WriteBits(0x00,9);        //送9 bit 的NOP
  512.     P2OUT|=SPI45DB041_CS;
  513.     NOP();
  514.     delay(80000);
  515. }
  516. /********************************************************
  517. * 函数名:OperateSPIEnd
  518. 作用域:外部文件调用
  519. * 功能: 结束SPI的操作
  520. * 参数:
  521. * 返回值:
  522. * 创建人:
  523. *
  524. * 修改历史:(每条详述)
  525. ********************************************************/
  526. void OperateSPIEnd(void)
  527. {
  528. NOP();
  529. P2OUT|=SPI45DB041_CS;
  530. NOP();
  531. }