PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > dsPIC - Bộ điều khiển tín hiệu số 16-bit

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

dsPIC - Bộ điều khiển tín hiệu số 16-bit Theo dự kiến của Microchip, vào khoảng năm 2011 dsPIC sẽ có doanh số lớn hơn PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 29-04-2010, 07:35 PM   #1
lybao_huy
Đệ tử 5 túi
 
Tham gia ngày: Jan 2008
Bài gửi: 97
:
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 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-05-2010, 10:09 AM   #2
lybao_huy
Đệ tử 5 túi
 
Tham gia ngày: Jan 2008
Bài gửi: 97
:
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à .
lybao_huy vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-05-2010, 08:49 PM   #3
bien_van_khat
...Damned...
 
bien_van_khat's Avatar
 
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
:
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
__________________
- Xin đọc trước khi post bài

Xin đặt code trong thẻ [ code ] [ /code ]
bien_van_khat vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-05-2010, 11:46 AM   #4
lybao_huy
Đệ tử 5 túi
 
Tham gia ngày: Jan 2008
Bài gửi: 97
:
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ứ
lybao_huy vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 01:20 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam