View Single Post
Old 22-08-2009, 12:32 PM   #3
success.tl
Nhập môn đệ tử
 
Tham gia ngày: Jul 2008
Bài gửi: 9
:
Trích:
Nguyên văn bởi phamminhtuan View Post
Vì SPI bạn cấu hình là Slave, đọc dữ liệu từ Master bạn phải dùng hàm spi_data_is_in() trước.
Đối với đoạn code của bạn, khi gọi spi_read() thì CCS dịch ra như sau:
MOVFF SSP1BUF, _yourvar
Không có lệnh kiểm tra cờ nào cả, do đó cho dù có nối hay chưa thì nó đọc được kết quả hiển thị ra PortD không có gì lạ cả.
Bạn có thể dịch thử trong MPLAB, view->program memory để xem Disassember

Vì bạn post code không đủ, nên nếu nói thiếu thì thiếu nhiều, ví dụ bạn khởi tạo ngắt, hàm ngắt của bạn ở đâu ...,

Bạn có thể tham khảo 2 ví dụ của CCS là EX_SPI.C và EX_SPI_SLAVE.C trong thư mục [C:\Program Files\PICC\Examples] nếu cài CCS ở ổ C
Cảm ơn bạn phamminhtuan, theo ý kiến của bạn thì mình đã làm được rồi!
Tuy nhiên, mình sử dụng ngắt chứ ko sử dụng thuật toán thăm dò: data=spi_data_is_in()...
Mình Post 2 đoạn Code, bạn nào cần thì tham khảo nha, truyền-nhận ngon lắm!!!

Master Code:

Code:
#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#include <lcd_lib_4bit.c>
//*********************************
int8 data;
//*********************************
void main()
{
output_high(pin_c2);
data = 0b00110010; //Thử một giá trị để truyền
setup_spi( SPI_MASTER | SPI_L_TO_H);
delay_ms(1000);
while(1)
{
output_low(pin_c2); //Chân C2 dùng Select chip
spi_write(data);
output_high(pin_c2);
delay_us(10);//Tao tre giua 2 lan truyen
}
}
//*******************************

Slave Code:

Code:
#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#include <lcd_lib_4bit.c>
//*************************
int8 data;
//*************************
#int_ssp
void ssp_isr(void)
{
data = spi_read();
output_d(data);  //Hiển thị ra Port D
}
//*************************
void main()
{
setup_spi(SPI_SLAVE|SPI_L_TO_H);
clear_interrupt(INT_SSP);
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL); 
while(1)
{
//Ko làm gì, đợi Data đến
}
}
//************************

thay đổi nội dung bởi: falleaf, 22-08-2009 lúc 06:48 PM.
success.tl vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn