|
инициализация SPI на PIC |
|
|
|
Nov 26 2010, 07:21
|
Группа: Участник
Сообщений: 10
Регистрация: 25-02-10
Пользователь №: 55 657

|
В общем с пиками дел мало имел, хочу инициализировать SPI на нем вот то что получилось Код list p=16F877A #include <p16F877A.inc> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; cycle_1 equ 0x20 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;Prepare;;;;;;;;;;;;;;;;;;;; clrf PORTA clrf PORTC clrf PORTD bcf STATUS,RP0 movlw 0x00 movwf INTCON movlw b'11010011' movwf PORTC movlw b'00000100' movwf PORTD movlw b'11111110' movwf PORTA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;Initial;;;;;;;;;;;;;;;;;;; SPI_Initial bsf STATUS,RP0 bsf TRISC,3 bsf TRISC,5 bcf TRISC,2 ;;cs low bcf SSPSTAT,SMP bcf SSPSTAT,CKE bcf STATUS,RP0 ;; 0 bcf SSPCON,0 ;ведущий режим SPI, bcf SSPCON,1 ;тактовый сигнал bcf SSPCON,2 ; =Focs/4 bcf SSPCON,3 bsf SSPCON,4 bsf SSPCON,5
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;Power cycle;;;;;;;;;;;;;; bsf STATUS,RP0 bsf TRISC,2 ;;cs high bcf STATUS,RP0
loop movlw 0xFF movwf SSPBUF goto loop end В общем я ожидаю получить на осцилографе импульсы с выхода SCK и SDO ...... А вокруг тишина....
|
|
|
|
|
Nov 27 2010, 04:16
|
Группа: Участник
Сообщений: 10
Регистрация: 25-02-10
Пользователь №: 55 657

|
Ну хорошо, просто я и так и так пробовал, сейчас поиенял, ситуация не изменилась....что еще может быть
|
|
|
|
|
Nov 29 2010, 12:45
|
Группа: Участник
Сообщений: 10
Регистрация: 25-02-10
Пользователь №: 55 657

|
Да, спасибо...заработала....хреновина -)
|
|
|
|
|
Jan 17 2011, 06:41
|
Группа: Новичок
Сообщений: 4
Регистрация: 17-01-11
Пользователь №: 62 273

|
Уже какой день бьюсь с инициализацией SPI, ничего не выходит, вроде все перепроверил, все норм (вроде), а контроллер не хочет в прерывание входить! Подскажите в чем может быть проблема. Код ANSEL= 0b00000000; // все выводы как цифровые ANSELH= 0b00000000; // все выводы как цифровые CM1CON0= 0b00000000; // отключаем компаратор CM2CON0= 0b00000000; ADCON0= 0b00000000; // отключаем АЦП
TRISA= 0b00001000; TRISB= 0b00010000; // RB6= SCK RB4= SDI/SDA TRISC= 0b00000000; // RC7= SDO RC6= SS RC6= 1;
GIE= 1; PEIE= 1; SSPIE= 1; IRCF0= 1; // 111 = 8MHz IRCF1= 1; IRCF2= 1;
SMP= 0; CKE= 1; CKP= 1; SSPM0= 0; // 0000 = SPI Master mode, clock = FOSC/4 SSPM1= 0; SSPM2= 0; SSPM3= 0; SSPEN= 1; а вот сама работа с SPI Код char SPI_RW(char DATA_OUT) // вывод в SPI { SSPBUF= DATA_OUT; while (!SPI_FLAG); SPI_FLAG = 0; return SSPBUF; } SPI_FLAG устанавливается в прерывании, в которое он так не хочет упорно входить, соответственно так и остается в цикле.
|
|
|
|
|
Jan 17 2011, 14:09
|
Группа: Новичок
Сообщений: 4
Регистрация: 17-01-11
Пользователь №: 62 273

|
Микроконтроллер PIC16F689. Листинг соответствует сишной программе, т.е компилятор ничего не оптимизировал и не удалил.
Сообщение отредактировал HammerN - Jan 17 2011, 14:10
|
|
|
|
|
Jan 18 2011, 04:53
|
Частый гость
 
Группа: Участник
Сообщений: 181
Регистрация: 26-11-10
Пользователь №: 61 198

|
HammerN, а разве не надо биты TRIS, соответствующие всем выводам SSP установить в "1" (сделать входами)? Посмотрите в даташите схему соответствующих выводов портов, возможно, выходы модуля SSP у Вас "закорочены" на выходную защелку PORTx Цитата SPI_FLAG устанавливается в прерывании А обработчик прерывания покажите, может в нем проблема? Или прерывание вообще не возникает? Что в отладке видно?
|
|
|
|
|
Jan 18 2011, 05:12
|
Группа: Новичок
Сообщений: 4
Регистрация: 17-01-11
Пользователь №: 62 273

|
TRIS устанавливал в соответствие с даташитом, как указано в разделе SPI. вот обработчик, но тут все просто, выставлет флаг и все. Код void interrupt isr(void) { if ((SSPIE) && (SSPIF)) { SPI_FLAG= 1; SSPIF= 0; } } прерывание вообще не возникает, такое ощущение что SPI просто выключен, раз он даже флаг не ставит, а отладка просто виснет в бесконечном цикле, т.к флаг выставлять никто не хочет.
|
|
|
|
|
Jan 18 2011, 13:37
|
Частый гость
 
Группа: Участник
Сообщений: 181
Регистрация: 26-11-10
Пользователь №: 61 198

|
HammerN, вроде все правильно у Вас, в протеусе работает, а в MPLAB SIM действительно не возникает прерывание, да и не должно, посмотрите ограничения симулятора: Цитата For devices with the listed peripherals, these peripherals are NOT supported: ... Serial I/O (i.e., SSP including I2C and SPI). As a result, the SSPSTAT register has been made readable and writable. Note: You can use stimulus to emulate many of the signals of SPI and have firmware read data as if it was SPI. Креплю проект в MPLAB и DSN файл для протеуса. Vlad27, там про прием в режиме ведомого - не тот случай.
Прикрепленные файлы
SSP.zip ( 52.03 килобайт )
Кол-во скачиваний: 32
|
|
|
|
|
Jan 18 2011, 15:27
|
Частый гость
 
Группа: Свой
Сообщений: 95
Регистрация: 31-07-05
Из: Полоцк Беларусь
Пользователь №: 7 227

|
Цитата(stas00n @ Jan 18 2011, 15:37)  Vlad27, там про прием в режиме ведомого - не тот случай. Совершенно верно, проглядел.
|
|
|
|
|
Jan 18 2011, 19:08
|
Группа: Новичок
Сообщений: 4
Регистрация: 17-01-11
Пользователь №: 62 273

|
stas00n, СПАСИБО огромное! уж на что, а на симулятор я даже и не подумал.
|
|
|
|
|
Feb 4 2011, 06:20
|
Группа: Новичок
Сообщений: 3
Регистрация: 2-02-11
Пользователь №: 62 641

|
Господа специалисты. Помогите новичку! Имеется блок с PIC18F6520, который после сбоя по питанию ЧАСТИЧНО перестал нормально функционировать. На блоке есть разъем (DB9), далее MAX232, дальше USART2 выводы контроллера (6;8;5;4). Мои попытки связаться с контроллером из различных программ (MPLAB, PCWHD Compiler) с ноутбука безрезультатны. (пишет нет связи, или проверьте кабель) Кабель и MAX232 исправны. В блоке есть возможность установки нескольких перемычек, возможно какие-то использовались для организации связи через USART2. Помогите установить связь с ноутбука с PIC18F6520. С уважением Mika
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|