PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   dsPIC - Bộ điều khiển tín hiệu số 16-bit (http://www.picvietnam.com/forum/forumdisplay.php?f=29)
-   -   Lỗi khó hiểu trong SPI Module (http://www.picvietnam.com/forum/showthread.php?t=6252)

lybao_huy 29-04-2010 07:35 PM

Lỗi khó hiểu trong SPI Module
 
Các bạn xem 2 đoạn code dưới đây :
Đoạn code 1:
while(1){
WriteSPI1(0x45);
while(SPI1STATbits.SPITBF);delay_us(20);
WriteSPI1(0b10);
while(SPI1STATbits.SPITBF);delay_us(20);
WriteSPI1(0b10);
while(SPI1STATbits.SPITBF);delay_us(20);
WriteSPI1(0b10);
while(SPI1STATbits.SPITBF);delay_us(20);
WriteSPI1(0b10);
while(SPI1STATbits.SPITBF);delay_us(20);
WriteSPI1(0x95]);
while(SPI1STATbits.SPITBF);delay_us(20);
WriteSPI1(0xf0);
while(SPI1STATbits.SPITBF);delay_us(20);
}

và Đoạn code 2:
while(1){
WriteSPI1(0x45);
while(SPI1STATbits.SPITBF);
WriteSPI1(0b10);
while(SPI1STATbits.SPITBF);
WriteSPI1(0b10);
while(SPI1STATbits.SPITBF);
WriteSPI1(0b10);
while(SPI1STATbits.SPITBF);
WriteSPI1(0b10);
while(SPI1STATbits.SPITBF);
WriteSPI1(0x95]);
while(SPI1STATbits.SPITBF);
WriteSPI1(0xf0);
while(SPI1STATbits.SPITBF);
}
Tôi quan sát trên bộ Analyzer(bộ phân tích logic) thì thấy rằng ở đoạn code 1 nó hiển thị đầy đủ các byte 0x45 0b10 0b10 0b10 0b10 0x95 0xf0, nhưng ở đoạn code 2 nó hiển thị thiếu thông tin cụ thể chỉ có 0x45 0b10 0b10 0xf0. Tôi không hiểu tại sao nữa, bởi vì tôi chờ bit SPI1STATbits.SPITBF ==0 tức bộ đệm truyền trống rỗng mới truyền tiếp. xin giải thích hộ.

lybao_huy 03-05-2010 10:09 AM

có ai giải thích hộ dùm không vậy, hay là con Dspic bị hư, mà tôi thấy giao tiếp UART và Đoạn code 1 chạy tốt mà .

bien_van_khat 03-05-2010 08:49 PM

1 - Đoạn code 2 có vẻ OK. Bạn đang dùng dsPIC nào?? trình dịch nào?
2 - cờ SPITBF được set khi ghi vào thanh ghi SPIxBUF, và xóa khi dữ liệu từ SPIxBUF được đưa ra shift register. Tức là cờ này được xóa khi dữ liệu chưa đc đẩy ra hết trên bus SPI. Trong trường hợp đoạn code 2 lỗi, bạn có thể thử thay bằng cách kiểm tra cờ ngắt SPIxIF

lybao_huy 04-05-2010 11:46 AM

sau nhiều ngày nghiên cứu thì tôi phát hiện ra rằng:
1-Khi ghi vào bộ đệm SPI1BUF rồi chờ bit SPITBF=0 rồi sau đó phải chờ ít nhất là 1 chu kỳ clock(clock của SPI module không phải clock của chu kỳ máy),rồi mới được ghi vào SPI1BUF, nếu không nó bỏ qua việc ghi vào SPI1BUF.
2-khi dùng ngắt thì chú ý rằng: cờ ngắt chỉ ngắt khi nào bít SPIROV=0, nếu SPIROV=1 thì ngắt không bao giờ xảy ra.

Các bạn đọc thêm trong DsPic33FJ Family Silicon Errata and Data Sheet Clarification.
Trong khi đó, trong datasheet của Dspic33fj64gp804 lại không nói gì có chết không cơ chứ


Múi giờ GMT. Hiện tại là 09:54 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam