Tình hình là em đang làm thực tập tốt nghiệp, thầy giao calibration cái mạch Công tơ số đã có. Nhiệm vụ của em giờ là lấy ra data từ bản ghi dữ liệu bên trong con STPM01 qua giao tiếp SPI của con stpm01, truyền lên PC. mạch dùng vdk AT89C52.
Con stpm01 là con đo đạc và tính toán công suất tiêu thụ điện năng. các giá trị tức thời của dòng điện và điện áp phục vụ tính toán công suất lưu trong 1 trong các bản ghi đó. Mỗi bản ghi 32 bit. Em chỉ cần đọc 1 bản ghi thui. Đọc datasheet có thủ tục đọc thế này
[IMG][/IMG]
t1 → t2: Pha Latching (chốt), thời gian > 2/fCLK (con stpm01 dùng thạch anh 4MHz thì là 500ns)
t2 → t3: Data được chốt, SPI rỗi, thời gian > 30ns
t3 → t4: Hiện SPI cho hoạt động đọc, thời gian > 30ns
t4 → t5: Reset bộ đếm đồng hồ nối tiếp, thời gian > 30ns
t5 → t6: SPI được reset và hiện cho hoạt động đọc, thời gian > 30ns
t7: Data nội được truyền lên SDATD
t8: Data SDATD được ổn định và có thể được đọc
và đây là đoạn code em viết theo cái thủ tục trên:
void RecordReading (unsigned char NoR){ // NoR = Number of Records to Read
unsigned char i,j,k;
unsigned long DataTemp;
for (i = 0; i < NoR; i++){
DataRecord[i] = 0; // Reset all DataRecord
}
SYN = 0;
SYN = 1; // Latching phase done
_nop_(); // SPI idle
SCS = 0; // Enable SPI for read operation
SYN = 0;
SYN = 1; // Reset serial clock counter
SCL = 0;
for (i = 0; i < NoR; i++){
for (j = 0; j < 4; j++){
DataTemp = 0;
for (k = 0; k < 8; k++){
SCL = 1;
if (SDA) DataTemp |= 0x01;
else;
DataTemp <<= 1;
SCL = 0;
}
DataTemp <<= j*3;
}
DataRecord[i] |= DataTemp;
}
ReloadHighState();
}
void ReloadHighState(void){
SCS = 1;
SYN = 1;
SCL = 1;
SDA = 1;
}
Các đàn anh có kinh nghiệm trong lĩnh vực đọc data này cho em ý kiến với, xem có sai chỗ nào k? Làm thế nào lấy được data từ các bản ghi đó? Em thử thì lần nào đọc cũng chỉ ra 1 loại ký tự ở bất kỳ bản ghi nào
Con stpm01 là con đo đạc và tính toán công suất tiêu thụ điện năng. các giá trị tức thời của dòng điện và điện áp phục vụ tính toán công suất lưu trong 1 trong các bản ghi đó. Mỗi bản ghi 32 bit. Em chỉ cần đọc 1 bản ghi thui. Đọc datasheet có thủ tục đọc thế này
[IMG][/IMG]
t1 → t2: Pha Latching (chốt), thời gian > 2/fCLK (con stpm01 dùng thạch anh 4MHz thì là 500ns)
t2 → t3: Data được chốt, SPI rỗi, thời gian > 30ns
t3 → t4: Hiện SPI cho hoạt động đọc, thời gian > 30ns
t4 → t5: Reset bộ đếm đồng hồ nối tiếp, thời gian > 30ns
t5 → t6: SPI được reset và hiện cho hoạt động đọc, thời gian > 30ns
t7: Data nội được truyền lên SDATD
t8: Data SDATD được ổn định và có thể được đọc
và đây là đoạn code em viết theo cái thủ tục trên:
void RecordReading (unsigned char NoR){ // NoR = Number of Records to Read
unsigned char i,j,k;
unsigned long DataTemp;
for (i = 0; i < NoR; i++){
DataRecord[i] = 0; // Reset all DataRecord
}
SYN = 0;
SYN = 1; // Latching phase done
_nop_(); // SPI idle
SCS = 0; // Enable SPI for read operation
SYN = 0;
SYN = 1; // Reset serial clock counter
SCL = 0;
for (i = 0; i < NoR; i++){
for (j = 0; j < 4; j++){
DataTemp = 0;
for (k = 0; k < 8; k++){
SCL = 1;
if (SDA) DataTemp |= 0x01;
else;
DataTemp <<= 1;
SCL = 0;
}
DataTemp <<= j*3;
}
DataRecord[i] |= DataTemp;
}
ReloadHighState();
}
void ReloadHighState(void){
SCS = 1;
SYN = 1;
SCL = 1;
SDA = 1;
}
Các đàn anh có kinh nghiệm trong lĩnh vực đọc data này cho em ý kiến với, xem có sai chỗ nào k? Làm thế nào lấy được data từ các bản ghi đó? Em thử thì lần nào đọc cũng chỉ ra 1 loại ký tự ở bất kỳ bản ghi nào