Trích:
Nguyên văn bởi phamminhtuan
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
}
}
//************************