×
单片机 > 单片机程序设计 > 详情

ATMEGA8 SPI 总线读写 93C46

发布时间:2020-06-04 发布时间:
|

// PIN assignment 

#define SS PB2 //Chip select 

#define SCK PB5 //cLOCk 

#define MOSI PB3 //input 

#define MISO PB4 //output 

#define SS_SET (PORTB|=(1<#define SCK_SET (PORTB|=(1<#define MOSI_SET (PORTB|=(1<
#define SS_CLR (PORTB &= ~(1<#define SCK_CLR (PORTB &= ~(1<#define MOSI_CLR (PORTB &= ~(1<

void spi_init(void) 

    DDRB |= (1<    DDRB &=~(1<     
    SPCR = 0x53; 
    SPSR = 0x00;         



void SendByte(u8 sData) 

    SPDR = sData; 
    while(!(SPSR & (1<



u8 spi_read(void) 

    SPDR = 0x00; 
    while(!(SPSR & (1<    return SPDR; 


////////////////////////////////////////////////// 

//start and stop condition of 93C46 


void Start(void) 

    u8 temp; 

    temp = SPCR; 
    SPCR = 0; // 禁止SPI功能 

//----------------------------------------------- 

    SCK_CLR; // 手工产生一个起始位,93C46特殊的地方 

    MOSI_SET; // 所以要特殊处理 

    SS_SET; 
    SCK_SET; 
//-----------------------------------------------  

    SPCR = temp; // 使能SPI功能 



void Stop(void) 

    SS_CLR; 


////////////////////////////////////////////////// 

// write enable / diable 

void EWEN(void) 

    Start(); 
    SendByte(0x30); // EWEN command 

    Stop(); 


void EWDS(void) 

    Start(); 
    SendByte(0x00); // EWDS command 

    Stop(); 



////////////////////////////////////////////////// 

// read word 

u16 ReadWord(u8 addr) 

    u16 temp=0; 
    u8 hig,low; 
     
    Start(); 
    SendByte(addr | 0x80); // read command 

    //------------------------ 切换到SPI模式1  

    SPCR = 0x5b; 
    hig = spi_read(); 
    low = spi_read();  
       //------------------------ 切换回SPI模式0 

    SPCR = 0x53; 
    Stop(); 
    temp = (hig<<8) + low ; 
    return temp; 


////////////////////////////////////////////////// 

// write a word 

void WriteWord(u16 data,u8 addr) 

    EWEN(); 
    Start(); 
    SendByte(addr | 0x40); // write command 

    SendByte((u8)(data>>8)); // send hig byte 

    SendByte((u8)data); // send low byte 

    Stop(); // wait at lease 2ms 



void WriteAll(u16 data) 

    EWEN(); // write enable 

    Start(); 
    SendByte(0x10); // write command 

    SendByte((u8)(data>>8)); // send hig byte 

    SendByte((u8)data); // send low byte 

    Stop(); // wait at lease 10MS 




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析