Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Программная инженерия > Микроконтроллеры, робототехника, схемотехника, 3D принтеры
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.08.2017, 13:57   #1
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию Не стартует SPI на PIC24

Здравствуйте.
Есть PIC24F16KA101. Почему то не стартует SPI модуль.
При попытке передать данные он повисает в ожидании флага навечно. ((
Вот код инициализации:

Код:
Код:
TRISA = LATA = 0xFF;
    TRISB = LATB = 0xFF;

    AD1CON1 = 0x0000;
    AD1CON2 = 0x0000;
    AD1CON3 = 0x0000;
    AD1PCFG = 0xffff; // all pins digital

    CM1CON = 0x0000; // disable comparator
    CM2CON = 0x0000;

// внутренний осцилятор с умножителем
    OSCCON = 0x0001; // 8MHz and 4xPLL = 32MHz
    CLKDIV = 0x0000;

    RCONbits.SWDTEN = 0; // disable watchdog
    RCONbits.WDTO = 0;
Инициализация SPI
Код:
PMD1 = 0; // enable all available periph
    PMD2 = 0;
    PMD3 = 0;
    
    RCFGCAL = 0x0000;

    SPI1STATbits.SPIEN = 0;

    IFS0bits.SPI1IF = 0;
    IEC0bits.SPI1IE = 0; // disable interrupt
    IPC2bits.SPI1IP = 7;

    SPI1STATbits.SPIEN = 0; // disable
    SPI1STATbits.SPISIDL = 0; // work in Idle

    // wrong??
    SPI1STATbits.SPIBEC = 1; // element count 
    SPI1STATbits.SRMPT = 1; // ready send or receive
    SPI1STATbits.SPIROV = 0; // clear overflow
    SPI1STATbits.SR1MPT = 1; // receive FIFO empty
    SPI1STATbits.SISEL = 0b101; //Interrupt when the last bit is shifted out of SPI1SR; now the transmit is complete
    SPI1STATbits.SPITBF = 0; // hardware clear or set
    SPI1STATbits.SPIRBF = 0; // hardware clear or set
    // ----------

    SPI1CON1bits.DISSCK = 0; // internal clock enable
    SPI1CON1bits.DISSDO = 0; // use SDO1
    SPI1CON1bits.MODE16 = 0; // 8 bit mode
    SPI1CON1bits.SMP = 0; // middle sampled data
    SPI1CON1bits.CKE = 0; // set data idle to active
    SPI1CON1bits.SSEN = 0; // SS not used
    SPI1CON1bits.CKP = 0; // low - idle, active - high
    SPI1CON1bits.MSTEN = 1; // master mode
    SPI1CON1bits.SPRE = 6;
    SPI1CON1bits.PPRE = 3;

    SPI1CON2 = 0x000;
    SPI1STATbits.SPIEN = 1; // start SPI

    UINT16 data = 0xba; // test data
    SPI1BUF = data; // write to buffer for TX
    while (!SPI1STATbits.SPIRBF); // Вот тут вечный висяк. 

!! если остановить в этом месте то и регистры не показывают никаких изменений. Все флаги в том состоянии которое было до записи данных в SPI1BUF.

data = SPI1BUF; // read the received value
Проверял флаги ошибок во время выполнения цикла.
Все по нулям:
Код:
IFS0bits.SPF1IF = 0;
    IFS0bits.SPF1IF = 0;
    IEC0bits.SPF1IE = 1;
Другие модули (таймер, усарт) работают нормально.
Подскажите пожалуйста что это может быть?? Или я куда то не туда смотрю?
Спасибо.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 31.08.2017, 22:09   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Я - не ПИКоман, посоветовать не могу, могу только порекомендовать форум
http://radiokot.ru/forum/viewforum.p...cf5b84f6c6167e - он больше с "железным" уклоном, а этот - с софтовым. Там много толковых ребят, хотя и ПИКоман'ы
На чем проверялось - в железе или в Противнусе ?
digitalis вне форума Ответить с цитированием
Старый 31.08.2017, 22:39   #3
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

в симмуляторе mplabx. в железе похоже что работает. через пиккит3 в отладчике вроде бы правильно все считывает. но отладка в железе очень долгий процесс.. толи глюк мплаба толи где то включить надо спи.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 28.12.2021, 15:17   #4
Nif-naf
Форумчанин
 
Аватар для Nif-naf
 
Регистрация: 05.09.2016
Сообщений: 131
По умолчанию

Код:
spi1interrupt(){
while(spi1if==0);
;}
надо tbf в spistat проверять, а лучше из прерывания
Немного о GoAsm.

Последний раз редактировалось Nif-naf; 28.12.2021 в 15:37.
Nif-naf вне форума Ответить с цитированием
Старый 26.02.2022, 11:51   #5
Nif-naf
Форумчанин
 
Аватар для Nif-naf
 
Регистрация: 05.09.2016
Сообщений: 131
По умолчанию

Код:
 ad1pcfgh=0x3;если есть
_Builtin_write_OSCCONL(OSCCON & 0XBF); unlock
_sdi1R=3F;
_Builtin_write_OSCCONL(OSCCON | 0X40);
Немного о GoAsm.

Последний раз редактировалось Nif-naf; 26.02.2022 в 11:56.
Nif-naf вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
по spi 16 бит 25-й кадр Помощь студентам 7 29.12.2021 13:53
Нужна помощь по SPI Mersedesik4 Общие вопросы C/C++ 0 13.05.2014 08:44
SPI-обмен между ATmega644 (Master) и ATtiny2313 (Slave shev.mitia Помощь студентам 2 26.02.2011 13:00
SPI-обмен между ATmega644 (Master) и ATtiny2313 (Slave) shev.mitia Софт 1 02.02.2011 21:01
Просьба к тем, кто работал с SPI для Atmel Sannara Помощь студентам 13 18.02.2009 16:34