Chào các bác !
Em đang dính quả với MCP3421, không nhận được đúng dữ liệu.
MCU sẽ đọc liên tiếp 3 hoặc 4 byte dữ lieu từ MCP gồm 2 hoặc 3 byte ADC và 1 byte config của MCP cuối cùng.
Tuy nhiên, MCU chỉ nhận được byte đầu tiên trong chuỗi dữ lieu, các byte sau trả về 0xFF.
Bác nào đi qua cho em xin đôi lời chỉ giáo.
Phía dưới là code của em. Dùng I2C mềm.
Code khởi tạo MCP
Code hàm Start
Code hàm Write
Hàm Read
Hàm Stop
Setup MCP
Chỗ này có 1 vấn đề là nếu gán sai địa chỉ vẫn có ACK xuất hiện. Theo em được biết thì ACK sẽ xuất hiện do device trùng địa chỉ và xuất ra SDA khi có xung thứ 9 của SCL.
Nhận data
Chỗ này chỉ nhận được byte middle biến thiên theo điện áp vào trên MCP, còn các dữ lieu về sau đều là 0xFF.
PS: Em không thấy mục nào phù hợp bài này nên đặt tạm đây. Mod thấy phù hợp mục khác thì move giúp em nhé !
Em đang dính quả với MCP3421, không nhận được đúng dữ liệu.
MCU sẽ đọc liên tiếp 3 hoặc 4 byte dữ lieu từ MCP gồm 2 hoặc 3 byte ADC và 1 byte config của MCP cuối cùng.
Tuy nhiên, MCU chỉ nhận được byte đầu tiên trong chuỗi dữ lieu, các byte sau trả về 0xFF.
Bác nào đi qua cho em xin đôi lời chỉ giáo.
Phía dưới là code của em. Dùng I2C mềm.
Code khởi tạo MCP
Code:
void MCP3421Init(){ SCL=1; SDA=1; SDA_DIR=1; // giai phong SDA cua duong truyen I2C }
Code:
void MCP3421Start(){ SDA_DIR=0; // SDA la pin output SDA=0; // keo SDA xuong truoc SCL=0; // keo SCL xuong sau }
Code:
unsigned char MCP3421WriteData(unsigned char data){ SDA_DIR=0; // SDA la pin output for(int i=0;i<8;i++){ SDA=((data & 0x80) >0 ); // out bit 7 SCL=0; // keo SCL xuong 0 chuan bi phat xung clock SCL=1; // clock SCL=0; // data<<=1; // dich trai 1 bit } // set SDA la input de nhan ACK tu MCP SDA_DIR=1; // phat xung clock xac nhan ACK SCL=0; SCL=1; unsigned char ack = (unsigned char)SDA; SCL=0; return ack; }
Code:
unsigned char MCP3421ReadData(unsigned char ack){ SDA_DIR=1; // SDA la chan input de lay du lieu unsinged char retval=0; for(int i=0;i<8;i++){ retval<<=1; // dich trai de ghi bit vao bit 0 SCL=0; // chuan bi clock SCL=1; // clock retval |= (unsigned char)SDA; // lay bit tra ve SCL=0; // ket thuc clock } if(ack>0){ // neu co yeu cau xuat clock xu ly ACK SCL=0; SCL=1; SCL=0; } return retval; }
Code:
void MCP3421Stop(){ SCL=1; // kéo SCL len truoc SDA=1; // keo SDA len sau }
Chỗ này có 1 vấn đề là nếu gán sai địa chỉ vẫn có ACK xuất hiện. Theo em được biết thì ACK sẽ xuất hiện do device trùng địa chỉ và xuất ra SDA khi có xung thứ 9 của SCL.
Code:
void Setup(){ MCP3421Init(); MCP3421Start(); MCP3421WriteData(0xD0); // dia chi MCP MCP3421WriteData(0x9C); // 12 bit ADC, continuous mode, 1V/V }
Chỗ này chỉ nhận được byte middle biến thiên theo điện áp vào trên MCP, còn các dữ lieu về sau đều là 0xFF.
Code:
void Get(){ MCP3421Start(); MCP3421WriteData(0xD1); // dia chi MCP + read data delay_us(20); MCP3421Start(); // re start unsigned char midle = MCP3421ReadData(1); // nhan byte ADC midle unsigned char low=MCP3421ReadData(1); // nhan byte ADC low unsigned char config = MCP3421ReadData(0); // nhan byte cau hinh cua MCP MCP3421Stop(); }
Comment