![]() |
|
|
Продукция MICROCHIP Технические вопросы по всей продукции Microchip |
![]() |
|
Опции темы | Опции просмотра |
![]() |
#1 |
Junior Member
Регистрация: 29.01.2009
Возраст: 38
Сообщений: 6
Вес репутации: 100/0 ![]() ![]() |
![]()
Помогите, пожалуйста.
Есть pic18f4550 (20MHz), pic18f252 (4МHz). Надо реализовать их обмен по SPI. Одиночный байт передаю и принимаю нормально. Больше одного за раз- никак. Осциллографом увидел, что MASTER отдает нужное кол-во байт, т.е. дело (вроде бы) в SLAVE-е. Компилятор MCC18. Код для мастера: Код:
{ unsigned char buff[]="Heh"; ... OpenSPI(SPI_FOSC_64,MODE_00,SMPMID); ... buff[0] = ..; buff[1] = ..; putcSPI(0b10100000); //код команды putcSPI(2); //кол-во байт в буфере putsSPI(buff); //буфер } Код:
while(1) { value = ReadSPI(); switch(value) { ... case 0b10100000: while(!DataRdySPI()); count = getcSPI(); while(!DataRdySPI()); getsSPI(buff,count); T1= (unsigned int)(2+3*buff[0]); T2= (unsigned int)(2+3*buff[1]); break; } } Последний раз редактировалось majorPAE; 29.01.2009 в 20:33. Причина: Мог бы и сам исправить... ;) |
![]() |
![]() |
![]() |
#2 | |
Super Moderator
Регистрация: 19.03.2007
Адрес: Львов
Возраст: 44
Сообщений: 3,334
Вес репутации: 2341/100 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
Код:
T1= (unsigned int)(2+3*buff[0]); например, если buff[0] = 200, то Т1 = 90 |
|
![]() |
![]() |
![]() |
#3 |
Junior Member
Регистрация: 29.01.2009
Возраст: 38
Сообщений: 6
Вес репутации: 100/0 ![]() ![]() |
![]()
Исправился:
Код:
T1= 2+3*(unsigned int)buff[0]; |
![]() |
![]() |
![]() |
#4 |
Super Moderator
Регистрация: 19.03.2007
Адрес: Львов
Возраст: 44
Сообщений: 3,334
Вес репутации: 2341/100 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
![]() |
#5 |
Junior Member
Регистрация: 29.01.2009
Возраст: 38
Сообщений: 6
Вес репутации: 100/0 ![]() ![]() |
![]()
Не помогло. Дак как по SPI принять за раз >1байта?
|
![]() |
![]() |
![]() |
#6 |
Super Moderator
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,808
Вес репутации: 5397/165 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
![]() |
#7 |
Junior Member
Регистрация: 29.01.2009
Возраст: 38
Сообщений: 6
Вес репутации: 100/0 ![]() ![]() |
![]()
я написал в первом посте, что 1 байт мастером шлю, слейвом принимаю, причем то, что надо.
и спрашиваю, как отправить мастером пачку байт, чтобы слейв их тоже принял. у меня слейв же принимает только первый байт. |
![]() |
![]() |
![]() |
#8 | |
Super Moderator
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,808
Вес репутации: 5397/165 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
чтобы посоветовать что-то осмысленное, надо привести их содержимое. особо смущает функция getsSPI(buff,count); Сделайте для начала попроще - while (!SSPIF) -> чтение байта -> while (!SSPIF) -> чтение и т.д. уверен, всё получится... |
|
![]() |
![]() |
![]() |
#9 | ||
Super Moderator
Регистрация: 19.03.2007
Адрес: Львов
Возраст: 44
Сообщений: 3,334
Вес репутации: 2341/100 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
Код:
void getsSPI( unsigned char *rdptr, unsigned char length ) { while ( length ) // stay in loop until length = 0 { *rdptr++ = getcSPI(); // read a single byte length--; // reduce string length count by 1 } } unsigned char ReadSPI( void ) { SSPBUF = 0x00; // initiate bus cycle while ( !SSPSTATbits.BF ); // wait until cycle complete return ( SSPBUF ); // return with byte read } ![]() 2Andd3dfx просто сделать примитивный буфер и без всяких проверок отослать с десяток байт и посмотреть, что принимается ну и то, что Greg посоветовал - сначала попроще, а потом уже и функции подключать Цитата:
сначала ждешь, пока buf заполнится, потом его обнуляешь и ждешь читаешь следующий... глянь в описание библиотек, там есть пример работы с spi Последний раз редактировалось vitalka; 01.02.2009 в 09:29. |
||
![]() |
![]() |
![]() |
#10 |
Junior Member
Регистрация: 29.01.2009
Возраст: 38
Сообщений: 6
Вес репутации: 100/0 ![]() ![]() |
![]()
Разобрался, просто по получению первого байта я включал высокоприоритетное прерывание по таймеру с очень малым периодом.
Подправил период - все стало хорошо. Всем спасибо. |
![]() |
![]() |
![]() |
Метки |
pic18, spi |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | |
Опции просмотра | |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Прерывание SPI в dsPIC33FJ33GP202 | Любопытный | Продукция MICROCHIP | 6 | 28.11.2008 17:29 |
Цифровой потенциометр и аппаратный SPI | michipic | Продукция MICROCHIP | 38 | 09.10.2008 21:05 |
SPI PIC18F452 | Alexey Belodvortsev | Продукция MICROCHIP | 4 | 25.03.2008 22:59 |
Прога для Pic16c63a | Reitar | Продукция MICROCHIP | 1 | 20.04.2007 23:35 |
SPI еще раз | ssp | Продукция MICROCHIP | 7 | 17.04.2007 19:19 |