SPI

SPI

delay.h

#include <main.h>

#ifndef  _DELAY_H
#define _DELAY_H

void delay_ms(uint timer);

#endif

delay.c

#include "main.h"

void delay_ms(uint timer)
{
    uchar j = 124;
    while(timer--)
    {
        while(j--);
    }
}

spi.h

#ifndef _SPI_H
#define _SPI_H 

#include <reg51.h>
#include "main.h"

sbit SCK = P2^4;
sbit SDO = P2^5;
sbit SDI = P2^6;
sbit CS = P2^7;

void init_SPI();
uchar read_SPI_SR();
void write_SPI_SR(uchar rs);
uchar read_SPI(uchar addr);
void write_SPI(uchar dat, uchar addr);

#endif

spi.c

#include <intrins.h>
#include "main.h"
#include "spi.h"

#define READ 0x03
#define WRITE 0x02
#define WREN 0x06
#define WRDI 0x04
#define RDSR 0x05
#define WRSR 0x01

void delay()
{
    uchar i;
    for(i = 0; i < 4; i++)
    {
        _nop_();
    }
}

void init_SPI()
{
    CS = 1;
    delay();
    SCK = 1;
    delay();
    SDO = 1;
    delay();
    SDI = 1;
    delay();
}

uchar SPI_read_byte()
{
    uchar i;
    uchar dat = 0x00;
    SCK = 0;
    for (i = 0; i < 8; ++i)
    {
        SCK = 0;
        delay();
        SCK = 1;
        delay();
        dat <<= 1;
        dat |= (uchar)SDI;
    }
    return dat;
}

void SPI_write_byte(uchar dat)
{
    uchar i;
    SCK = 0;
    for (i = 0; i < 8; ++i)
    {
        SCK = 0;
        SDO = (bit)(dat&0x80);
        delay();
        SCK = 1;
        delay();
        dat<<=1;
    }

}

void write_SPI(uchar dat, uchar addr)
{
    SCK = 0;
    CS = 0;
    delay();
    SPI_write_byte(WREN);
    CS = 1;
    delay();
    CS = 0;
    delay();
    SPI_write_byte(WRITE);
    SPI_write_byte(addr);
    SPI_write_byte(dat);
    CS = 1;
    SCK = 0;
}

uchar read_SPI(uchar addr)
{
    uchar dat;
    SCK = 0;
    delay();
    CS = 0;
    delay();
    SPI_write_byte(READ);
    SPI_write_byte(addr);
    dat = SPI_read_byte();
    CS = 1;
    delay();
    SCK = 0;
    delay();
    return dat;
}

void write_SPI_SR(uchar sReg)
{
    CS = 0;
    delay();
    SPI_write_byte(WREN);
    CS = 1;
    delay();
    CS = 0;
    delay();
    SPI_write_byte(WRSR);
    SPI_write_byte(sReg);
    CS = 1;
    delay();
}

uchar read_SPI_SR()
{
    uchar sReg = 0;
    CS = 0;
    delay();
    SPI_write_byte(RDSR);
    sReg = SPI_read_byte();
    CS = 1;
    delay();

    return sReg;
}

main.h

#ifndef _SPI_H
#define _SPI_H 

#include <reg51.h>
#include "main.h"

sbit SCK = P2^4;
sbit SDO = P2^5;
sbit SDI = P2^6;
sbit CS = P2^7;

void init_SPI();
uchar read_SPI_SR();
void write_SPI_SR(uchar rs);
uchar read_SPI(uchar addr);
void write_SPI(uchar dat, uchar addr);

#endif

main.c

#include <reg51.h>
#include "main.h"
#include "delay.h"
#include "SPI.h"

#define DAT_ADDR 0X03

sbit LED1 = P2^0;
sbit LED2 = P2^1;

uchar g_ucDat;

void display(uchar dat)
{
    LED1 = 0;
    LED2 = 1;
    P0 = (dat%10);
    delay_ms(5);
    LED2 = 0;
    LED1 = 1;
    P0 = (dat/10);
    delay_ms(5);
}

void int0_init()
{
    EX0 = 1;
    IT0 = 1;
    EA = 1;
}

void int0_inter() interrupt 0
{
    g_ucDat++;
}

void main()
{
    uchar tmp = 0;
    
    g_ucDat = 0;
    int0_init();
    init_SPI();
    
    write_SPI_SR(0x00);
    delay_ms(10);
    tmp = read_SPI_SR();

    tmp = read_SPI(DAT_ADDR);
    if (tmp == 0xff)
    {
        tmp = 0;
        write_SPI(tmp, DAT_ADDR);
        delay_ms(10);
    }
    g_ucDat = tmp;

    while(1)
    {
        if(tmp != g_ucDat)
        {
            if(g_ucDat > 99)
            {
                g_ucDat = 1;
            }
            tmp = g_ucDat;
            write_SPI(tmp, DAT_ADDR);
            delay_ms(10);
        }
        display(tmp);
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 调试MPC8315E SPI EEPROM心得 最近领导交代任务,说帮忙改一个MPC8315E的U-boot程序,...
    爪爪熊阅读 5,521评论 0 3
  • SPI通信实验 SPI简介 串行外设接口(Serial Peripheral Interface Bus,SPI)...
    btskyrmb阅读 13,275评论 1 12
  • RT-Thread采用了类似于linux的函数调用方法,这里说明一下如何简单的使用设备。 硬件环境 :STM32F...
    linanwx阅读 7,570评论 0 0
  • Linux spi system SPI是由Motorola提出的一种全双工同步串行通信接口,通信波特率可以高达5...
    Creator_Ly阅读 8,832评论 0 6
  • 乌审旗工地一期工程结束后,黑猫专程来乌审旗接我。 看着风尘仆仆赶来的黑猫,我问他,工地收工,几十号人结伴而归,你这...
    魏昊霖阅读 3,833评论 73 41

友情链接更多精彩内容