新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 通過MSP430的IO口模擬I2C總線對AT24C25進行讀寫程序

        通過MSP430的IO口模擬I2C總線對AT24C25進行讀寫程序

        作者: 時間:2016-11-27 來源:網絡 收藏


        unsigned char EEPROM_ByteWrite(unsigned int addr,unsigned char data)
        {
        unsigned char Dev_addr; //設備地址
        unsigned char AddrLow;
        unsigned char AddrHigh;
        AddrLow = (unsigned char)addr;
        AddrHigh = (unsigned char)(addr>>8);
        Dev_addr = 0xa0|(AddrHigh<<1);
        i2c_start();
        i2c_SendByte(Dev_addr);
        if(i2c_check_ACK() == FALSE)
        {
        return AckError;
        }
        i2c_SendByte(AddrHigh);
        if(i2c_check_ACK() == FALSE)
        {
        return AckError;
        }
        i2c_SendByte(AddrLow);
        if(i2c_check_ACK() == FALSE)
        {
        return AckError;
        }
        i2c_SendByte(data);
        if(i2c_check_ACK() == FALSE)
        {
        return AckError;
        }
        i2c_stop();
        i2c_delay_ms(10);
        return 0;
        }

        unsigned char EEPROM_RandomRead(unsigned int addr)
        {
        unsigned char Dev_addr; //設備地址
        unsigned char AddrLow;
        unsigned char AddrHigh;
        unsigned char tmp;
        AddrLow = (unsigned char)addr;
        AddrHigh = (unsigned char)(addr>>8);
        Dev_addr = 0xa0|(AddrHigh<<1);
        i2c_start();
        i2c_SendByte(Dev_addr);
        if(i2c_check_ACK() == FALSE)
        {
        return AckError;
        }
        i2c_delay_ms(5);
        i2c_SendByte(AddrHigh);
        if(i2c_check_ACK() == FALSE)
        {
        return AckError;
        }
        i2c_SendByte(AddrLow);
        if(i2c_check_ACK() == FALSE)
        {
        return AckError;
        }
        i2c_delay_ms(5);
        i2c_start();
        Dev_addr = 0xa1|(AddrHigh<<1);
        i2c_SendByte(Dev_addr);
        if(i2c_check_ACK() == FALSE)
        {
        return AckError;
        }
        i2c_delay_ms(5);
        tmp = i2c_RevByte();
        i2c_SendNoAck();
        i2c_stop();
        i2c_delay(100);
        return tmp;
        }

        本文引用地址:http://www.104case.com/article/201611/322430.htm


        unsigned int EEPROM_PageWrite(unsigned int page,unsigned char* p,unsigned char n)
        {
        unsigned char Dev_addr;
        unsigned char AddrLow;
        unsigned char AddrHigh;
        unsigned int tmp;
        if((n > 64)|(page > 512)) //根據讀寫的設備而變更為適合的頁數和每頁字節數
        {
        return OutOfRang;
        }
        tmp = ((unsigned int)page) << 6; //得出頁首地址
        AddrLow = (unsigned char)tmp;
        AddrHigh = (unsigned char)(tmp>>8);
        Dev_addr = 0xa0 | (AddrHigh << 1);
        i2c_start();
        i2c_SendByte(Dev_addr);
        if(i2c_check_ACK() == FALSE)
        {
        return AckError;
        }
        i2c_delay_ms(5);
        i2c_SendByte(AddrHigh);
        if(i2c_check_ACK() == FALSE)
        {
        return AckError;
        }
        i2c_SendByte(AddrLow);
        if(i2c_check_ACK() == FALSE)
        {
        return AckError;
        }
        while(n--)
        {
        i2c_SendByte(*p++);
        if(i2c_check_ACK() == FALSE)
        {
        return AckError;
        }
        }
        i2c_stop();
        i2c_delay_ms(10);
        return 0;
        }

        unsigned char EEPROM_SequentialRead(unsigned int addr,unsigned int n,unsigned char* p)
        {
        unsigned char Dev_addr; //設備地址
        unsigned char AddrLow;
        unsigned char AddrHigh;
        if(n > (32768 - addr)) //檢查預寫入地址是否有效
        {
        return OutOfAddr;
        }
        AddrLow = (unsigned char)addr;
        AddrHigh = (unsigned char)(addr>>8);
        Dev_addr = 0xa0|(AddrHigh<<1);
        i2c_start();
        i2c_SendByte(Dev_addr);
        if(i2c_check_ACK() == FALSE)
        {
        return AckError;
        }
        i2c_delay_ms(5);
        i2c_SendByte(AddrHigh);
        if(i2c_check_ACK() == FALSE)
        {
        return AckError;
        }
        i2c_SendByte(AddrLow);
        if(i2c_check_ACK() == FALSE)
        {
        return AckError;
        }
        i2c_delay_ms(5);
        i2c_start();
        Dev_addr = 0xa1|(AddrHigh<<1);
        i2c_SendByte(Dev_addr);
        if(i2c_check_ACK() == FALSE)
        {
        return AckError;
        }
        while(n--)
        {
        *p = i2c_RevByte();
        p++;
        if(n)
        i2c_SendAck();
        else
        i2c_SendNoAck();
        }
        i2c_stop();
        return 0;
        }

        main()
        {
        //unsigned char tt,tt1;
        WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
        DCOCTL = 0X73;
        BCSCTL1= 0X87; // 設置時鐘頻率4.00MHz
        P5DIR |=0X03;
        P5OUT |=0X03;
        //EEPROM_ByteWrite(0x0,12);
        //tt=EEPROM_RandomRead(0x0);
        //tt1=tt;
        EEPROM_PageWrite(2,dat,14);
        EEPROM_SequentialRead(128,14,x);
        }


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 望奎县| 义马市| 奉化市| 伊通| 沙雅县| 晋州市| 聂荣县| 五河县| 资中县| 伊吾县| 霍城县| 沛县| 闸北区| 南汇区| 利辛县| 康平县| 白城市| 固阳县| 岳普湖县| 广灵县| 葵青区| 敦煌市| 永善县| 齐齐哈尔市| 克山县| 长阳| 太湖县| 柞水县| 左权县| 桂东县| 尼玛县| 石柱| 衢州市| 贺州市| 板桥市| 邢台市| 二连浩特市| 巴林右旗| 怀宁县| 双鸭山市| 大连市|