打印
[AT32L021]

【AT-START-L021测评】+25LC040读写

[复制链接]
1109|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
比神乐|  楼主 | 2024-11-30 21:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
代码:
#include "at32l021_board.h"
#include "at32l021_clock.h"
#include "OLED.h"
/** @addtogroup AT32L021_periph_examples
  * @{
  */
#define uint unsigned int
#define u8  unsigned char

#define READ_INSTRUCTION  0x03 // ???(??25LC040,????????????)  
#define WRITE_INSTRUCTION 0x02 // ???(??,??????????)  
#define WREN_INSTRUCTION  0x06 // ?????  

unsigned char readData,readData1,readData2;

void _nop_(void)
{
        int i;
        for(i=0;i<20;i++);
}
void SPI_Init(void) {  
    // ???SPI??,????????  
}  
  
void SPI_SendByte(unsigned char byte) {  
    // ??SPI??????
                u8 i;
                for(i=0;i<8;i++)
                {
                        //SCK=0;
                        at32_lc040_off(SCK1);
                        _nop_();
                        _nop_();
                        if((byte&0x80)==0x80)
                                at32_lc040_on(SI);
                        else
                                at32_lc040_off(SI);
                        _nop_();
                        _nop_();
                        byte<<=1;
                        //SCK=1;
                        at32_lc040_on(SCK1);
                        _nop_();
                        _nop_();
                }
}  
u8 SPI_SendByte1(unsigned char byte) {  
    // ??SPI??????
                u8 i,date=0;
                for(i=0;i<8;i++)
                {
                        date<<=1;
                        //SCK=0;
                        at32_lc040_off(SCK1);
                        _nop_();
                        _nop_();
                        if((byte&0x80)==0x80)
                                at32_lc040_on(SI);
                        else
                                at32_lc040_off(SI);
                        _nop_();
                        _nop_();
                        byte<<=1;
                        //SCK=1;
                        at32_lc040_on(SCK1);
                        _nop_();
                        _nop_();
                        //SO=1;
                        if(at32_soin_state())
                                date|=1;
                }
                return date;
}  
  
unsigned char SPI_ReceiveByte(void) {  
    // ??SPI??????  
                u8 i,dat=0;
        for(i=0;i<8;i++)
        {
                dat<<=1;
                //SCK=1;                        //第一位
                at32_lc040_on(SCK1);
                _nop_();
                        _nop_();
        //SCK=0;
                at32_lc040_off(SCK1);
                _nop_();
                        _nop_();
                //SO=1;
                if(at32_soin_state())
                        dat|=1;
               
                _nop_();
                        _nop_();
               
        }
               
               
    return dat; // ??????????????  
}  
  
void SPI_CS_Low(void) {  
    // ???????  
    //CS = 0; // ?????????P1.0??
                at32_lc040_off(CS1);
}  
  
void SPI_CS_High(void) {  
    // ???????  
    //CS = 1; // ?????????P1.0??
                at32_lc040_on(CS1);
}


// ????  
void EEPROM_WriteByte(unsigned char address, unsigned char date) {  
    SPI_CS_Low(); // ??????  
    SPI_SendByte(WREN_INSTRUCTION); // ???????  
    SPI_CS_High(); // ??????,???????(??????)  
      
    SPI_CS_Low(); // ????????  
    SPI_SendByte(WRITE_INSTRUCTION); // ?????  
    //SPI_SendByte((address >> 8) & 0xFF); // ???????(??25LC040,?????)  
    SPI_SendByte(address); // ???????  
    SPI_SendByte(date); // ????  
    SPI_CS_High(); // ??????,?????  
      
    // ???????????,?????EEPROM????  
}  
  
unsigned char EEPROM_ReadByte(unsigned char address) {  
    unsigned char date;  
      
    SPI_CS_Low(); // ??????  
    SPI_SendByte(READ_INSTRUCTION); // ?????  
    //SPI_SendByte((address >> 8) & 0xFF); // ???????(??25LC040,?????)  
    SPI_SendByte(address ); // ???????  
    date = SPI_SendByte1(0 ); // ????  
    SPI_CS_High(); // ??????,?????  
      
    return date;  
}  

void EEPROM_ReadByte1(unsigned char address) {  
    //unsigned char date;  
      
    SPI_CS_Low(); // ??????  
    SPI_SendByte(READ_INSTRUCTION); // ?????  
    //SPI_SendByte((address >> 8) & 0xFF); // ???????(??25LC040,?????)  
    SPI_SendByte(address ); // ???????  
    readData = SPI_ReceiveByte(); // ????
                readData1 = SPI_ReceiveByte();
         readData2 = SPI_ReceiveByte();
    SPI_CS_High(); // ??????,?????  
      
   // return date;  
}  
  
void MS_delay(uint MS)
{
    uint x,y;
    for(y=MS;y>0;y--)
    {
            for(x=796;x>0;x--);
    }
}
/** @addtogroup 021_GPIO_led_toggle GPIO_led_toggle
  * @{
  */

/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  main function.
  * @param  none
  * @retval none
  */
int main(void)
{
        u8 bai,shi,ge;
  uint i=0;
        system_clock_config();

  at32_board_init();
        LCD_Init();
  LCD_CLS();
        //LCD_P8x16Str(45,5,(u8*)"EASEAR");
        //LCD_P6x8Str(0,7,(u8*)"www.holteksupport.com");
        //Draw_BMP(0,0,100,3,(u8*)Dot);
        SPI_Init(); // ???SPI??  
      
    // ??:?????EEPROM  
    EEPROM_WriteByte(0x00, 169); // ???0x0000??0xAB
                for(i=0;i<30000;i++);
    EEPROM_WriteByte(0x01, 208); // ???0x0000??0xAB
                for(i=0;i<30000;i++);
                EEPROM_WriteByte(0x02, 135); // ???0x0000??0xAB
                for(i=0;i<30000;i++);
                readData=EEPROM_ReadByte(0); // ???0x0000????  
    bai= readData/100+'0';
                shi=readData%100/10+'0';
                ge=readData%10+'0';
                LCD_P8x16Char(0,0,bai);
                LCD_P8x16Char(8,0,shi);
                LCD_P8x16Char(16,0,ge);
                readData1 = EEPROM_ReadByte(0x01); // ???0x0000????  
    bai= readData1/100+'0';
                shi=readData1%100/10+'0';
                ge=readData1%10+'0';
                LCD_P8x16Char(0,2,bai);
                LCD_P8x16Char(8,2,shi);
                LCD_P8x16Char(16,2,ge);
                        _nop_();
                readData2 = EEPROM_ReadByte(0x02); // ???0x0000????  
                bai= readData2/100+'0';
                shi=readData2%100/10+'0';
                ge=readData2%10+'0';
                LCD_P8x16Char(0,4,bai);
                LCD_P8x16Char(8,4,shi);
                LCD_P8x16Char(16,4,ge);
  while(1)
  {
    at32_led_toggle(LED2);
//                at32_oled_on(SCL);
//                at32_oled_on(SDA);
//                at32_oled_on(RST);
//                at32_oled_on(DC);
//    delay_ms(10);
//                at32_oled_off(SCL);
//                at32_oled_off(SDA);
//                at32_oled_off(RST);
//                at32_oled_off(DC);
                delay_ms(1000);
    //at32_led_toggle(LED3);
    //delay_ms(200);
    ///at32_led_toggle(LED4);
    //delay_ms(200);
  }
}
运行效果图:

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

467

主题

3526

帖子

7

粉丝