历史上的今天

今天是:2024年10月18日(星期五)

正在发生

2019年10月18日 | PIC16C74单片机SPI方式读写串行EEPROM程序

发布者:Harmonious88 来源: eefocus关键字:PIC16C74  单片机  SPI方式  读写串行EEPROM 手机看文章 扫描二维码
随时随地手机看文章

; list  p=16C74, st=off
; PORTC PIN DESCRIPTION
; SCK bit 3, SDI bit 4, SDO bit 5, CS bit 7
; Fosc = 10.0 MHz, thus each instr. cycle = 400ns

;***************Ram Register Definitions*******************************

 
   rxdata equ 25h
   addr   equ 26h
   loops  equ 27h

;***************Bit Definitions****************************************
;#define   CS    PORTC,7           ; SPI chip select bit definition

;**********************************************************************


;***************25Cxxx command definitions
;#define      WREN  6                 ;write enable latch
;#define      WRDI  4                 ;reset the write enable latch
;#define      RDSR  5                 ;read status register
;#define      WRSR  1                 ;write status register
;#define      READ  3                 ;read data from memory
;#define      WRITE 2                 ;write data to memory

; Bit defines within status register
;#define      WIP   0                 ;write in progress
;#define      WEL   1                 ;write enable latch
;#define      BP0   2                 ;block protection bit
;#define      BP1   3                 ;block protection bit
;**********************************************************************

 ;        include "p16c74.inc"     ; 16C74 include file
 ;        __CONFIG   _WDT_OFF & _CP_OFF & _HS_OSC & _PWRTE_ON

;**********************************************************************
    page

         org   0000              ; Reset Vector
         clrf  PCLATH             ; ensure PCLATH bit 3 is cleared
         clrf  INTCON             ; ensure all interrupts are disabled
         goto  start              ; jump to the beginning of the program

         org   004              ; interrupt vector, do nothing
isr:      goto  isr                ; do nothing, location just
                                  ; identified in code


;***************BEGIN MAIN PROGRAM*************************************
;
start:    bcf   STATUS,5         ; need to set bank 0
         clrf  PORTC              ; initialize port c
         bsf   CS                 ; make sure cs is set 
         bsf   STATUS,5         ; need to set bank 1
         movlw 0x10               ; all bits are outputs except SDI
         movwf TRISC              ; for SPI setup
         bcf   STATUS,RP0         ; need to set bank 0
         movlw 0x31               ; SPI master, clk/16, ckp=1
         movwf SSPCON             ; SSPEN enabled
         movlw 0x10               ; *** put beginning address in addr**
         movwf addr               ; for later use

loop
;The first thing we will do is the WREN
         call  wren               ; call the write enable routine
;Next write status reg. to clear the block protect bits
         call  wrsr               ; call the write status routine
;Next do a busy test
         call  busy_test          ; test WIP bit in status register
;Then do the WREN before writing to the array
         call  wren               ; call the write enable command

;Next write 0xA5 (or any other value) to 0x10
         bcf   CS                 ; set chip select line low
         movlw WRITE              ; WRITE control byte
         call  output             ; call the output subroutine
         movlw b'00000000'        ; high addr byte is all 0's
         call  output             ; call the output subroutine
         movf  addr,w             ; low addr byte
         call  output             ; call the output subroutine
         movlw b'10100101'        ; load 0xA5 as data to be sent out
         call  output             ; call the output subroutine
         bcf   SSPCON,CKP         ; set clock idle low, mode 0,1
         bsf   CS                 ; set chip select, begin write cycle
         bsf   SSPCON,CKP         ; set clock idle high, mode 1,1

         call  busy_test
         call  rdsr               ; call the read status subroutine

;Now, read location 0x10h and store in rxdata. With Picmaster a
;user can break, read that memory location to see if the read worked
         bcf   CS                 ; set chip select line low
         movlw READ               ; READ control byte
         call  output             ; call the output subroutine
         movlw b'00000000'        ; high addr byte is all 0's
         call  output             ; call the output subroutine
         movf  addr,w             ; get ready to send next byte
         call  output             ; call the output subroutine
         movlw b'01011010'        ; move don't care byte of 0x5A into
         call  output             ; call the output subroutine
         bsf   CS                 ; bring chip select high end
                                  ; terminate read command

;While program is continuously looping, the user may halt (if using an
;emulator), and look at the data in rxdata. If it is 0xA5, the
;read/write worked.
         call  wait               ; little delay between SPI sequence
         goto  loop               ; do it all over again
                                  ; loop can be used to evaluate SPI
                                  ; signals on oscilloscope


;********************* BEGIN SUBROUTINES*******************************
;*** DELAY ROUTINE - 400uS ***
;
wait     movlw .200               ; timing adjustment variable
         movwf loops              ; move variable into loops
top      nop                      ; sit and wait
         nop                      ; no operation
         decfsz loops,f           ; loop complete?
         goto   top               ; no, go again
         return                   ; yes, return from sub


;****** This is the OUTPUT transmit/receive subroutine. ***************
output   movwf SSPBUF             ; place data in buffer to send
loop1    bsf   STATUS,RP0         ; specify bank 1
         btfss SSPSTAT,BF         ; has data been received (xmit done)?
         goto  loop1              ; not done yet, keep trying
         bcf   STATUS,RP0         ; specify bank 0
         movf  SSPBUF,W           ; empty receive buffer
         movwf rxdata             ; put received byte into rxdata
         return                   ; return from subroutine

;*******Write Enable Subroutine****************************************
wren     bcf   CS                 ; set chip select line low
         movlw WREN               ; WREN control byte
         call  output             ; Call the output subroutine
         bcf   SSPCON,CKP         ; set clock idle low, mode 0,1
         bsf   CS                 ; set chip select, begin write
         bsf   SSPCON,CKP         ; set clock idle high, mode 1,1
         return                   ; return from subroutine

;*******Read Status Register Subroutine********************************
rdsr     movlw RDSR               ; RDSR control byte
         call  output             ; Call the output subroutine
         movlw b'00000101'        ; this byte is a don't care byte
         call  output             ; status reg data will be in rxdata
         bsf   CS                 ; set chip select
         return                   ; return from subroutine

;*******Write Status Register Subroutine*******************************
wrsr     bcf    CS                ; set chip select line low
         movlw  WRSR              ; WRSR control byte
         call   output            ; Call the output subroutine
         movlw  b'00001000'       ; set BP1 bit in status register
         call   output            ; this will clear block protect bits
         bcf    SSPCON,CKP        ; set clock idle low, mode 0,1
         bsf    CS                ; set chip select
         bsf    SSPCON,CKP        ; set clock idle high, mode 1,1
         return                   ; return from subroutine

;*******Busy Test - WIP bit in Status Register*************************
busy_test
         bcf    CS                ; set chip select line low
         movlw  RDSR              ; RDSR control byte
         call   output            ; Call the output subroutine
         movlw  b'00000000'       ; send dummy byte
         call   output            ; to initiate clock sequence for read
         bsf    CS                ; else, set chip select high
         btfsc  rxdata,WIP        ; test WIP bit read from status register
         goto   busy_test         ; repeat busy test
         return                   ; return from subroutine

         end

[1] [1]
关键字:PIC16C74  单片机  SPI方式  读写串行EEPROM 引用地址:PIC16C74单片机SPI方式读写串行EEPROM程序

上一篇:PIC单片机定时器中断源程序
下一篇:PIC16C63单片机串口通信程序

推荐阅读

        新酷产品第一时间免费试玩,还有众多优质达人分享独到生活经验,快来新浪众测,体验各领域最前沿、最有趣、最好玩的产品吧~!下载客户端还能获得专享福利哦!  此前,荣耀已经宣布将于10月31日正式发布Magic2滑屏手机,并且目前在京东已经开启了预约。疑似关于这款机型的渲染图出现在网络上,显示这款机型将会有赛博朋克配色,并且配备...
中国储能网讯:2019年初,国家电网有限公司党组以习近平新时代中国特色社会主义思想为指导,深入贯彻落实“四个革命、一个合作”能源安全新战略,顺应能源革命和数字革命融合发展趋势,创造性提出了“三型两网、世界一流”的战略目标,其中,“三型”是指枢纽型、平台型、共享型企业,围绕产业属性、网络属性、社会属性明确了发展方向;“两网”是指坚强...
10月15日晚间消息,今日索尼召开线上发布会,把大家等了将近一年的Xperia 1 II与海外发布不久的Xerpia 5 II一同发布,Xperia 1 II售价7999元,Xerpia 5 II售价5999元。等了一年Xperia 1 II终于来了,还有新配色Xperia 1 II在今年2月海外推出,它是Xperia 1的迭代版本,同时外观也延续上代设计,采用6.5英寸21:9 4K HDR OLED带鱼屏,这也...
在汽车行业智能化、网联化的发展趋势下,智能座舱已成为车企打造差异化竞争、提升用户体验的重要发力点。如何实现快速开发、节约研发成本、打造出功能丰富并具有竞争力的座舱产品,已经成为汽车产业链所面临的共同挑战。作为一家致力于汽车智能化的科技公司,亿咖通科技基于自身在智能座舱领域的深厚技术积累与行业前瞻思考,推出了兼具性能与性价比、具备强大...

史海拾趣

问答坊 | AI 解惑

MEGA16+1602LCD制作的LC测试仪

振荡器   IIBLC测量器的关键就是如图1所示的振荡电路。LM311是一个电压比较器,当电源被加上时,LM311的第2脚因为分压电路的存在为2.5V,引起比较器输出端为5V(此时由于C4的存在,末充电时等于短路).比较器的5V输出电压通过R4给C4充电,直 ...…

查看全部问答∨

手写开发请教

YC开发板手写开发请教我需要实现全屏手写的功能,目前为止得到的方法就是要自己写一个触摸屏的驱动,因为系统本身就有一个touch.dll,所以我其实只是做了一个包装,把touch.dll的函数用GetProcAddress得到后在调用,生成一个伪驱动mytouch.dll 我 ...…

查看全部问答∨

香主,请教一个outputcompare问题

um0427FWLibexamplesTIMTimeBase  例程中,是用TIM2作为定时器 ,然后从TIM3的4根GPIO管脚输出不同频率的波形。我现在有个问题:不能从TIM2的4根GPIO管脚输出吗?  (我把例程的输出管脚改为TIM2上的 PA0,PA1,P ...…

查看全部问答∨

求助

【求助】我打算选430芯片做频率测量,测量范围100K~200K(无丢失),RAM大于1K,串口1个,没有其它特殊要求,请大家帮忙选型,谢谢!…

查看全部问答∨

STM32L152V8

大家有在用STM32L152系列的MCU吗?想咨询个问题,我现在想做低功耗,需要进入Stop模式,但是看了下书,书上说进入STOP模式会关闭HSE,HSI,MSI等,只用LSE,我的外设和定时器,Uart都是用HSI的,那我进去后我的定时器是不是不能用了?我有两个管脚是 ...…

查看全部问答∨

都来说说你如何阅读源程序吧

说起来,很少正儿八经读别人的源程序。经常是喜欢直接看时序,看电路图,然后直接写程序,当然写的都是简单程序。后来工作所需,写串口,网络通信程序,当然没办法完全自己写,就参考例程,在原基础上调试增减API。虽说要改首先要看懂。但那些基本 ...…

查看全部问答∨

关于IAR编译器换行接着写的问题

c=sizeof(USB_CONFIGURATION_DESCRIPTOR)           + sizeof(USB_INTERFACE_DESCRIPTOR)          + (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DES ...…

查看全部问答∨

C2000晒晒 + TMS320F28035 experimenter kits (海量资料,肯定有你需要的!!)

秀秀刚刚买到手的28035开发板,呵呵,64pin的,P板非常简洁、做工很好,我喜欢!上电试了一下,工作正常,呵呵可惜没有光盘资料,去TI的网站上查了半天也没查到,有点郁闷。没办法,自己找吧,呵呵,EEWORLD非常好,资料很多啊,有待挖掘啊。下面是 ...…

查看全部问答∨

8962以太网升级的bootloader求助

尝试了坛子里各位大峡提供的以太网升级代码,怎么都测试不过,哪位老大能提供一份简单的以太网升级程序的bootloader测试代码?感谢!…

查看全部问答∨

MSI Layout Check Guide

微星 MSI  Layout Check Guide…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved