Tôi đang cố gắng định cấu hình mô-đun MSSP của PIC18F25K22 thành chế độ chính SPI. Tôi đang xem xét thời gian và đồng hồ không duy trì ổn định trong toàn bộ quá trình truyền. Một bức tranh cho thấy nó tốt hơn lời nói.
Sau khi gửi một chút, đồng hồ sẽ rút ngắn và không phải cùng một số tiền mỗi lần. Tôi chưa từng làm việc với SPI trước đây, nhưng các sơ đồ tôi đã tìm thấy trên Wikipedia và các tài nguyên khác chưa từng thể hiện điều này. Tôi cũng đã kết nối một Arduino và không thấy hành vi này. Mã của tôi là:
#pragma config FOSC = INTIO67 // Oscillator Selection bits (Internal oscillator block)
#pragma config PLLCFG = OFF // 4X PLL Enable (Oscillator used directly)
#pragma config BOREN = OFF // Brown-out Reset Enable bits (Brown-out Reset disabled in hardware and software)
#pragma config WDTEN = OFF // Watchdog Timer Enable bits (Watch dog timer is always disabled. SWDTEN has no effect.)
#pragma config MCLRE = EXTMCLR // MCLR Pin Enable bit (MCLR pin enabled, RE3 input pin disabled)
#pragma config LVP = OFF // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
#pragma config XINST = OFF // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
void main(void)
{
OSCCON = 0b11100110;
spi_setup();
__delay_ms(10);
byte temp;
while (TRUE)
{
temp = spi_transfer(0x00);
temp = spi_transfer(0x01);
temp = spi_transfer(0x02);
temp = spi_transfer(0x03);
temp = spi_transfer(0x04);
temp = spi_transfer(0x05);
__delay_us(1);
}
}
void spi_setup(void)
{
SSP1STAT = 0b00000000;
SSP1STATbits.CKE = HIGH; // data transmitted on rising edge
SSP1CON1 = 0b00000000; // enable Master SPI mode
SSP1CON1bits.CKP1 = LOW; //clock idle state is low
//i2c bits, all don't matters for SPI, cleared just in case
SSP1CON3 = 0;
// baud rate generation
SSP1ADD = 0; //FCLOCK = 8Mhz /2 = 2Mhz
// configure pins for output/input as needed
SDI1 = INPUT;
SDO1 = OUTPUT;
SCK1 = OUTPUT;
SS1 = OUTPUT;
SSP1CON1bits.SSPEN1 = HIGH; // enable pins for serial mode
}
unsigned char spi_transfer(unsigned char data)
{
SS1_LAT = LOW; // select slave
PIR1bits.SSPIF = LOW;
SSP1BUF = data;
//while (!SSP1STATbits.BF); //wait for receive to complete
while( !PIR1bits.SSPIF );
SS1_LAT = HIGH; // deselect slave
PIR1bits.SSPIF = LOW; // clear interrupt
return SSP1BUF; //return data from the slave
}
(cũng https://gist.github.com/stumpylog/5095250 )
Có ai gặp phải điều này hoặc có gợi ý về nguyên nhân?
Tôi đã làm gì
Cuối cùng, tôi không thể làm cho mô-đun MSSP1 hoạt động. Tuy nhiên, việc thay đổi nó thành mô-đun MSSP2, cùng mã chính xác, đã không thể hiện hành vi này. Tôi không thể giải thích nó, nhưng điều này đã giải quyết vấn đề.