![]() |
發(fā)布時間: 2019-9-4 21:18
正文摘要:最近做了個項目,要用到MSP430f149+24c02,還有一個數(shù)碼管顯示模塊,用的tm1650,用的也是iic總線。 同樣的配置,tm1650可以通,但是24c02,死活回不來數(shù)據(jù)。 用示波器看了sda和scl和的波形也是正常的。 已經(jīng)調(diào)了 ... |
whx.000 發(fā)表于 2019-9-5 08:02 謝謝了,問題已經(jīng)解決了。給sda和sdl加上10k的上拉電阻,在電源和gnd之間加一個104.就好了。 |
24c02_data = Read_Eeprom_OneData(0); 這個是上電讀EE吧,試試在讀數(shù)據(jù)的前后各加20ms的延時 |
問題解決了,在網(wǎng)上重新找了個圖。給電源個接了一個104電容,給SDA和SCL接了兩個10k的上拉電阻。搞定了。 |
eeprom.c //EEPROM-24c02底層驅(qū)動文件 #include <msp430f249.h> #include "delay.h" #include "iic.h" #include "eeprom.h" //EEPROM容量 //- 24C02, 256 X 8 (2K bits) //- 24C04, 512 X 8 (4K bits) //- 24C08, 1024 X 8 (8K bits) //- 24C16, 2048 X 8 (16K bits) //- 24C32, 4096 X 8 (32K bits) //- 24C64, 8192 X 8 (64K bits) //在EEPROM-24c02指定地址寫入一個數(shù)據(jù) //Addr:寫入數(shù)據(jù)的目的地址 0~255 for AT24C02 //Data:要寫入的數(shù)據(jù) void Write_Eeprom_OneData(u8 Addr,u8 Data) { IIC_Start(); Write_IIC_byte(WriteCom); //寫命令 IIC_Ack(); Write_IIC_byte(Addr); IIC_Ack(); Write_IIC_byte(Data); IIC_Ack(); IIC_Stop(); Delay_ms(10);//等待EEPROM寫入數(shù)據(jù)完成 } //在EEPROM-24c02指定地址讀出一個數(shù)據(jù) //Addr:開始讀數(shù)的目的地址 0~255 for AT24C02 //Data:讀到的數(shù)據(jù) u8 Read_Eeprom_OneData(u8 Addr) { u8 Data; IIC_Start(); Write_IIC_byte(WriteCom); //寫命令 IIC_Ack(); Write_IIC_byte(Addr); IIC_Ack(); IIC_Start(); Write_IIC_byte(ReadCom); //讀命令 IIC_Ack(); Data = Read_IIC_byte(); IIC_NoAck(); IIC_Stop(); return Data; } //檢查EEPROM-24c02是否正常 //返回1:檢測成功,返回0:檢測失敗 //EEPROM-24c02的最后一個地址(255)來存儲標(biāo)志字 u8 EEPROM_24C02_Check(void) { u8 temp; IIC_Init();//初始化IIC總線 temp = Read_Eeprom_OneData(255);//先讀取數(shù)據(jù) if(temp == 8) return 1; else { Write_Eeprom_OneData(255,8);//24C02的255位置第一次寫入數(shù)據(jù) temp = Read_Eeprom_OneData(255); if(temp == 8) return 1;//讀取數(shù)據(jù)成功 } return 0; } //在EEPROM-24c02里面的指定地址開始寫入0~4294967295的數(shù)據(jù) //Addr:開始寫入的地址;Data:數(shù)據(jù) //一個數(shù)據(jù)占用EEPROM-24c02四個地址 void Write_Eeprom_LenData(u16 Addr,u32 Data) { u8 t; for(t=0; t<4; t++) { Write_Eeprom_OneData(Addr+t,(Data>>(8*t))&0xFF); } } //在EEPROM-24c02里面的指定地址開始讀出0~4294967295的數(shù)據(jù) //Addr:開始讀出的地址 Data:數(shù)據(jù) //該函數(shù)用于讀出32bit的數(shù)據(jù) u32 Read_Eeprom_LenData(u16 Addr) { u8 t; u32 Data; for(t=0; t<4; t++) { Data <<= 8; Data += Read_Eeprom_OneData(Addr+4-t-1); } return Data; } //在EEPROM-24c02里面的指定地址開始寫入指定個數(shù)的字符串 //Addr:開始寫入的地址 對24c02為0~255;Buf:數(shù)據(jù)數(shù)組首地址;Num:要寫入數(shù)據(jù)的個數(shù) void Write_Eeprom_NubStr(u16 Addr,u8 *Buf,u16 Num) { while(Num --) { Write_Eeprom_OneData(Addr,*Buf); Addr ++; Buf ++; } } //在EEPROM-24c02里面的指定地址開始讀出指定個數(shù)的字符串 //Addr:開始讀出的地址 對24c02為0~255;Buf:數(shù)據(jù)數(shù)組首地址;Num:要讀出數(shù)據(jù)的個數(shù) void Read_Eeprom_NubStr(u16 Addr,u8 *Buf,u16 Num) { while(Num) { *Buf ++= Read_Eeprom_OneData(Addr ++); Num --; } } |
由于長度不足。 iic.c //模擬IIC總線底層驅(qū)動文件 #include <msp430f249.h> #include "delay.h" #include "iic.h" //IIC_SDA方向輸出 void IIC_SDAOut(void) { P5DIR |= (1<<1);//設(shè)置為輸出 } //IIC_SDA方向輸入 void IIC_SDAIn(void) { P5DIR &= ~(1<<1);//設(shè)置為輸入 } //IIC初始化 void IIC_Init(void) { P5SEL &= 0xf9;//設(shè)置P5.1,P5.2IO口為普通I/O模式 P5DIR |= 0x06;//設(shè)置P5.1,P5.2IO口方向為輸出 P5OUT |= 0x06;//初始設(shè)置P5.1,P5.2IO為高電平 IIC_SDA_H; IIC_SCL_H; Delay_us(5); } //起始信號函數(shù) void IIC_Start(void) { IIC_SDAOut(); IIC_SDA_H; IIC_SCL_H; Delay_us(5); IIC_SDA_L; Delay_us(5); } //停止信號函數(shù) void IIC_Stop(void) { IIC_SDAOut(); IIC_SDA_L; Delay_us(5); IIC_SCL_H; Delay_us(5); IIC_SDA_H; Delay_us(5); } //應(yīng)答函數(shù) void IIC_Ack(void) { u8 time = 220; IIC_SDAIn(); IIC_SCL_H; Delay_us(5); while(IIC_SDA_D && time --);//等待從機(jī)返回低電平應(yīng)答信號 IIC_SCL_L; Delay_us(5); } //非應(yīng)答函數(shù) void IIC_NoAck(void) { IIC_SDAOut(); IIC_SDA_H; Delay_us(5); IIC_SCL_H; Delay_us(5); IIC_SCL_L; Delay_us(5); } //寫字節(jié)函數(shù) void Write_IIC_byte(u8 Data) { u8 i; IIC_SDAOut(); IIC_SCL_L; for(i=0; i<8; i++) { if(Data & 0x80) { IIC_SDA_H; } else { IIC_SDA_L; } Data <<= 1; Delay_us(5); IIC_SCL_H; Delay_us(5); IIC_SCL_L; Delay_us(5); } IIC_SDA_H; Delay_us(5); } //讀字節(jié)函數(shù) u8 Read_IIC_byte(void) { u8 i, byte=0; IIC_SDAIn(); IIC_SCL_L; Delay_us(5); for(i=0; i<8; i++) { IIC_SCL_H; Delay_us(5); byte <<= 1; if(IIC_SDA_D) byte ++; Delay_us(5); IIC_SCL_L; Delay_us(5); } return byte; } |
Powered by 單片機(jī)教程網(wǎng)