历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-10-18 来源:eefocus

; 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

推荐阅读

史海拾趣

Ametherm公司的发展小趣事

随着产品质量的提升和市场口碑的积累,Ametherm公司开始积极拓展国内外市场。他们与多家知名企业建立了合作关系,将产品应用于各种电子设备中。同时,公司还积极参加国际电子展会,与全球客户进行交流与合作。这些举措使得Ametherm的品牌影响力逐渐扩大,市场份额也稳步提升。

Comchip Technology公司的发展小趣事

为了进一步扩大市场份额,Comchip Technology积极开拓国内外市场,与多家知名企业建立了长期稳定的合作关系。同时,公司还加强了与国际同行的交流与合作,引进了先进的技术和管理经验,不断提升自身的竞争力。

Carling Technologies公司的发展小趣事

面对日益激烈的市场竞争和技术变革,Carling Technologies始终保持着对技术创新的热情。公司投入大量资源进行产品研发和技术升级,推出了一系列具有创新性和高性能的产品。例如,在数据通信/电信领域,公司提供了全系列的创新型高性能、可靠的液压磁力断路器,满足了市场对高效、稳定产品的需求。这些技术创新和产品升级不仅提升了公司的竞争力,也为客户提供了更好的解决方案。

以上五个故事是基于Carling Technologies公司的发展历程和常识进行的概述,旨在描述其在电子行业中的发展和成就。请注意,这些故事是基于现有信息和常识的推测,并不代表公司实际发展的具体细节。如果您需要更详细的信息或故事,建议您查阅公司官方网站、新闻稿或相关行业报告。

ETC公司的发展小趣事

速通科技始终将用户体验放在首位。公司不断完善ETC系统的服务功能,提高了系统的稳定性和易用性。同时,速通科技还建立了完善的客户服务体系,为用户提供24小时不间断的在线客服支持。这些举措大大提高了用户对ETC系统的满意度和信任度。

常州星海电子(Starsea)公司的发展小趣事

常州星海电子有限公司,自1990年成立以来,便以生产中英合资的各类二极管为起点,逐渐在电子行业中崭露头角。随着公司业务的不断发展和市场需求的增长,2016年,公司正式更名为常州星海电子股份有限公司,完成了从合资到股份制的转变。这一转变不仅标志着公司管理结构的升级,也预示着公司在未来市场中的更大发展。

ETC2公司的发展小趣事

ETC2公司自创立之初,就专注于ETC技术的研发与创新。他们发现传统ETC系统存在信号识别率低、数据传输速度慢等问题,于是投入大量研发资源,成功开发出了新一代ETC设备。这款设备采用了先进的无线通信技术和高速数据处理芯片,大幅提升了信号识别率和数据传输速度,为高速公路收费系统带来了革命性的变革。ETC2公司的技术创新不仅赢得了市场的认可,也为其在电子行业中树立了良好的口碑。

问答坊 | AI 解惑

华为逻辑电平设计规范教材

华为逻辑电平设计规范教材…

查看全部问答>

怎么学好单片机

我是一个刚上大二的学生,看着单片机的一些东西觉得很感兴趣想学,但是又不知从何学起?希望高手指点一下帮我规划一下?小弟不胜感激。。。…

查看全部问答>

8051f单片机silicon ide编译请教

  我编译时提示 LInker not found C:\\Silabs...\\BIN\\bi51.exe是怎么回事,是我的软件没有装好吗? 可是我卸载了又装了还是这样 怎么回事刚开始用不懂 谢谢了…

查看全部问答>

STM32F10xx时钟系统框图:时钟是整个系统的脉搏

下图是STM32F10xx时钟系统的框图,通过这个图可以一目了然地看到各个部件时钟产生的路径,还可以很方便地计算出各部分的时钟频率。STM32的四个时钟源(HSI、HSE、LSI和LSE)也在图中标出;图中间的时钟监视系统(CSS)是在很多ST7的单片机中就出现 ...…

查看全部问答>

STM32串口控制寄存器疑问

准备采用中断法发送数据,看到datasheet描述USART_CR1位7(TXEIE)和位8(TCIE),不是太明白。采用那一种比较好?…

查看全部问答>

求助:利用MSP430制作函数发生器

我是一个菜鸟,目前有任务利用MSP430F1611制作一个函数发生器,信号最后经DAC12输出,函数波形方波,正弦波,三角波等,频率要求不高200Hz以下,请问各位高手应如何入手,有什么思路,小弟在此谢谢了。…

查看全部问答>

电子时钟控制程序

最近写了一个有关电子时钟控制的程序(我是初学者),程序调试时发现:当调节参数时,数码管显示不稳定。程序我修改了无数遍,就是不知道原因出在哪里!希望可以在各位大虾的帮助找出原因!!!!!   程序如下:   /*------ ...…

查看全部问答>

MXCHIP open

    玩这块板子,涵盖的知识太过广泛,刚开始熟悉大概流程,试过几个例子之后。觉得就那样,都是别人写好的代码,自己移植过去,自己想要一个深刻的理解,所以看了一些另外的一些协议之类的东西,也没着急弄这个东西,看了这么长时间后, ...…

查看全部问答>

直流/直流转换器数据表——系统效率揭秘

市面上售有各种类型的稳压器,但很难选择一款直流/直流稳压器。大多数汽车应用都要求在整个负载范围内保持高效率,因为它们一直在耗电。但话又说回来,许多工业应用在高负载时需要高效率,而在轻负载时,效率并不是很重要。因此必须了解直流/直流稳 ...…

查看全部问答>