em cấu hình như sau:
1/ giao tiếp spi//////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/////////////////////////////////////////////////////////////
em làm giao tiếp spi giữa con master là dspic30f4011, slave là dspic33fj256gp710. chỉ đơn giản là con master truyền liên tục các số từ 0-255, và slave sẽ nhận tín hiệu dạng word và hiển thị lên LCD, em cấu hình sao mà mãi mạch vẫn chưa chạy được anh à.
con master có lẽ là được rồi, còn con slave vẫn chưa nhận được . em cấu hình như sau:
em có dùng chân B0 của master để điều khiển chân SS của con slave
- con master: //////////////////////////////////////////////////////////////////
Code:
void khoi_tao_SPI1_master(void)//cke=1 ckp=0
{
//port master
_TRISF3=0;//sdo1
_TRISF2=1;//sdi1
_TRISF6=0;//sck1
_TRISB0=0;//chon vao ss
#define SS _LATB0
//SPI1STAT
SPI1STATbits.SPIEN=0;//tam thoi khoa
SPI1STATbits.SPISIDL=0;//tiep tuc khi IDLE
SPI1STATbits.SPIROV=0;//ko overflow
//SPI1STATbits.SPITBF=0;//su day bo truyen, readonly
//SPI1STATbits.SPIRBF=1;//1 la day,readonly
//SPI1CON
SPI1CONbits.FRMEN=0;// ko dung Frame,
SPI1CONbits.SPIFSD=0;//xung output cho master
SPI1CONbits.DISSDO=0;//sdo la dung cho spi
SPI1CONbits.MODE16=1;//dung data16bit
SPI1CONbits.SMP=0;//middle sample
SPI1CONbits.CKE=0;//clock tu active-idle-
SPI1CONbits.SSEN=0;//SS dung cho slave
SPI1CONbits.CKP=0;//idle=0,active=1
SPI1CONbits.MSTEN=1;//master mode
SPI1CONbits.SPRE=0;//master mode only
SPI1CONbits.PPRE=1;//master mode only//120khz
//start
SPI1STATbits.SPIEN=1;//khoi dong SPI
}
void ghi_spi1(unsigned int data)//nho pai co ss
{
int temp;
SS=0;
temp=SPI1BUF;
if(SPI1CONbits.MODE16)
{
SPI1BUF=data;LATE=SPI1BUF;
}
else
{
SPI1BUF=data&0xFF;LATE=SPI1BUF;
}
while(SPI1STATbits.SPITBF);//cho den khi gui xong
SS=1;
}
---con slave:///////////////////////////////////////////////////////////////////////////////////////////////////
Code:
void khoi_tao_SPI1_slave(void)//cke ckp=0
{
//port slave
_TRISF8=0;//sdo1
_TRISF7=1;//sdi1
_TRISF6=1;//sck1
_TRISB2=1;//ss1
_SPI1IF=0;
_SPI1IE=1;
_SPI1IP=7;
//SPI1STAT
SPI1STATbits.SPIEN=0;//tam thoi khoa
SPI1STATbits.SPISIDL=0;//tiep tuc khi IDLE
SPI1STATbits.SPIROV=0;//ko overflow
//SPI1STATbits.SPITBF=0;//su day bo truyen, readonly
//SPI1STATbits.SPIRBF=1;//1 la day,readonly
//SPI1CON1
//SPI1CON1bits.DISSCK=1;//enable xung sck(chi cho master)
SPI1CON1bits.DISSDO=0;//sdo la dung cho spi
SPI1CON1bits.MODE16=1;//dung data16bit
SPI1CON1bits.SMP=0;//slave mode pai la 0
SPI1CON1bits.CKE=0;//clock tu active-idle-
SPI1CON1bits.SSEN=1;//SS dung cho slave
SPI1CON1bits.CKP=0;//idle=0,active=1
SPI1CON1bits.MSTEN=0;//slave mode
//SPI1CON1bits.SPRE=8;//master mode only
//SPI1CON1bits.PPRE=//master mode only
//SPI1CON2
SPI1CON2bits.FRMEN=0;// ko dung Frame,
SPI1CON2bits.SPIFSD=1;//xung input cho slave
SPI1CON2bits.FRMPOL=1;//active high cho frame
SPI1CON2bits.FRMDLY=0;//xung dong bo khung truoc bit clock dautien
SPI1BUF=0;
//start
SPI1STATbits.SPIEN=1;//khoi dong SPI
}
unsigned int doc_spi1(void)
{
while(!SPI1STATbits.SPIRBF){LCD_gotoxy(1,1);LCD_write_string("treo");}/// trên LCD cho biết là con slave bị dừng ở đây không thoát đi được
if(SPI1STATbits.SPIRBF)
{
SPI1STATbits.SPIROV=0;
if(SPI1CON1bits.MODE16)
{
return(SPI1BUF);//word
}
else
{
return(SPI1BUF&0xFF);//byte
}
}
return -1;
}