Я пытаюсь настроить модуль MSSP PIC18F25K22 в основной режим SPI. Я смотрю на время, и часы не остаются стабильными на протяжении всей передачи. Картинка показывает это лучше, чем слова.
После отправки бита часы укорачиваются, и каждый раз не на одну и ту же величину. Я раньше не работал с SPI, но диаграммы, которые я нашел в Википедии и других ресурсах, никогда не показывают этого. Я также подключил Arduino и не видел этого поведения. Мой код:
#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
}
(также https://gist.github.com/stumpylog/5095250 )
Кто-нибудь сталкивался с этим или есть предложения относительно причины?
Что я сделал
В конце концов, я не смог заставить работать модуль MSSP1. Тем не менее, изменение его на модуль MSSP2, точно такой же код, не демонстрирует такое поведение. Я не могу это объяснить, но это решило проблему.
Ответы:
Это предположение, но вы, вероятно, сбрасываете то, что не должны быть каждым байтом. Такие вещи, как генератор битовой скорости и общая периферийная конфигурация, должны быть установлены только один раз.
Добавлено:
Теперь вы говорите, что не можете заставить работать MSSP1, но работаете. Это намекает на то, что у вас есть ошибка в другом месте кода, который делает непреднамеренные записи. Случается, что он достигает некоторого состояния MSSP1, поэтому он действует странным образом и почему MSSP2 работает.
Не просто отпустить это. Переход на MSSP2 может решить проблему, но в лучшем случае вы обошли ее, возможно, временно. В следующий раз, когда вы будете связываться с вещами в разных местах, может быть нацарапана другая память. Если вы не найдете и действительно исправите это, эта прошивка будет вечно нестабильной. Наихудший случай - когда нет явных симптомов, делающих вам одолжение, чтобы дать понять, что есть проблема. Проблема появится через год, когда будут найдены только правильные данные, только клиентские сайты, после 1000 находятся в поле. ИСПРАВИТЬ ЭТО ПРАВО СЕЙЧАС.
источник
Похоже, что у вас могут быть проблемы с целостностью сигнала - на снимке в Лос-Анджелесе появляется линия с часами, когда линия данных падает. Попробуйте убедиться, что они хорошо изолированы, а трасса или проводка не слишком длинные. Вы также пытаетесь уменьшить тактовую частоту или добавить небольшой RC-фильтр на линии (если линии длинные, может помочь только последовательный резистор, скажем, 220 Ом)
Если у вас есть осциллограф, проверьте линии с этим, чтобы убедиться, что целостность сигнала хорошая. Если это не так, попробуйте приведенные выше предложения и отрегулируйте их до тех пор, пока не получите сигналы хорошего качества.
источник