Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 24.02.2017, 12:40   #1
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 35
Сообщений: 502
Вес репутации: 349/37
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Прием данных по SPI, c 16x8Byte на 8х8Byte переделать

Всем привет,

есть старый проект на ПИК32 там SPI работает в "enhanced buffer mode" 16x8 Byte, работает без проблем, вот прием 14 байт данных:
Код:
        SPI1BUF=255;
        SPI1BUF=255;
        SPI1BUF=255;
        SPI1BUF=255;
        SPI1BUF=255;
        SPI1BUF=255;
        SPI1BUF=255;
        SPI1BUF=255;
        SPI1BUF=255;
        SPI1BUF=255;
        SPI1BUF=255;
        SPI1BUF=255;
        SPI1BUF=255;
        SPI1BUF=255;

        while (!SPI1STATbits.SRMT);

        read_bytes[0] = SPI1BUF;
        read_bytes[1] = SPI1BUF;
        read_bytes[2] = SPI1BUF;
        read_bytes[3] = SPI1BUF;
        read_bytes[4] = SPI1BUF;
        read_bytes[5] = SPI1BUF;
        read_bytes[6] = SPI1BUF;
        read_bytes[7] = SPI1BUF;
        read_bytes[8] = SPI1BUF;
        read_bytes[9] = SPI1BUF;
        read_bytes[10] = SPI1BUF;
        read_bytes[11] = SPI1BUF;
        read_bytes[12] = SPI1BUF;
        read_bytes[13] = SPI1BUF;
мне надо прием данных переделать на дсПИК33ЕП, проблема у этого ПИКа "enhanced buffer mode" 8х8 Байт, как мне переделать, а то я чтото туплю. Данные проходят без задержек, куском в 14 Байт.
Gera82 вне форума   Ответить с цитированием
Старый 24.02.2017, 13:06   #2
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 35
Сообщений: 502
Вес репутации: 349/37
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: Прием данных по SPI, c 16x8Byte на 8х8Byte переделать

Будет вот так работать? нашел и переписал:
Код:
      
     unsigned int out_len = 14, in_len = 14;
     unsigned int len = out_len  + in_len;  
     unsigned int sent = 0, recv = 0, i = 0;

while (sent < len || recv < len) {
        if (SPI1STATbits.SPIBEC != 7 && sent < len) {
            SPI1BUF = 255;
        }
        if (!SPI1STATbits.SRXMPT && recv < len) {
            if( recv < out_len )
                // Before out_len, discard the data
                dummy = SPI1BUF;
            else
                // After out_len, store the data in in[]
                read_bytes[i++] = SPI1BUF;
            recv++;
        }
        }
Gera82 вне форума   Ответить с цитированием
Старый 24.02.2017, 16:09   #3
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 35
Сообщений: 502
Вес репутации: 349/37
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: Прием данных по SPI, c 16x8Byte на 8х8Byte переделать

Вот до максимума оптимизировал, но все равно не работает, виснет.
14(sent) раз шлет данные , Ну только 8 (recv) раз получает данные, а надо 14 раз, тогда бы я и не зависал в цикле, что не так?
Код:
  
unsigned int len = 14;
     unsigned int sent = 0, recv = 0;
 
while(1)
    {
        if(SPI1STATbits.SPIBEC != 7 && sent < len)
        { SPI1BUF = 0xff, sent++;}
        if(SPI1STATbits.SRXMPT == 0 && recv < len)
        {read_bytes[recv] = SPI1BUF; recv++;}
        if( sent == len && recv == len )
        break;
    }
Gera82 вне форума   Ответить с цитированием
Старый 24.02.2017, 16:31   #4
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,314
Вес репутации: 2626/57
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Прием данных по SPI, c 16x8Byte на 8х8Byte переделать

Gera82
при блокирующем чтении Вам нет пользы от enchanced buffer mode.
возьмите обычный режим из какого-нибудь примера.
besogon вне форума   Ответить с цитированием
Старый 24.02.2017, 16:42   #5
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 35
Сообщений: 502
Вес репутации: 349/37
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: Прием данных по SPI, c 16x8Byte на 8х8Byte переделать

Цитата:
Сообщение от besogon Посмотреть сообщение
Gera82
при блокирующем чтении Вам нет пользы от enchanced buffer mode.
возьмите обычный режим из какого-нибудь примера.
enchanced buffer mode. нужен мне для отправки данных 14байт, только при этом моде я могу отправлять данные без задержек, куском, и также мне надо принять данные в 14 байт тоже куском, это не SPI это
Manchester-Code, так я его реализовал и он пик32 работал.

или мне на лету переключать с enchanced buffer mode на standard buffer mode???

как мне в "enchanced buffer mode" принять 14 байт куском (без задержек)???
Gera82 вне форума   Ответить с цитированием
Старый 24.02.2017, 21:56   #6
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,314
Вес репутации: 2626/57
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Прием данных по SPI, c 16x8Byte на 8х8Byte переделать

Gera82
Код:
...
#define BUFFERSIZE 8
/**
* atomic xmit fore some purposes
* @param txdata - data to tx, if NULL will tx 0xff
* @param rxdata - data to rx, if NULL data will be discarded
*/
inline void spi_txrx(pic24_enhspi_t* __restrict__ spi, const uint8_t* __restrict__ txdata, uint8_t* __restrict__ rxdata, uint8_t txcount, uint8_t rxcount){
static const uint8_t bogus_txdata[8] = {[0 ... 7] = 0xff };
__attribute__((unused)) uint8_t bogus_rxdata[8];
auto void buffer_put(uint8_t data*, uint8_t count);
auto void buffer_get(uint8_t data*, uint8_t count);
__label__ last;
	__builtin_disable_interrupts();
	for(;(txcount >= BUFFERSIZE)||(rxcount >= BUFFERSIZE);){
		txcount -= buffer_put(txdata?txdata:bogus_txdata, txcount);
		rxcount -= buffer_get(rxdata?rxdata:bogus_rxdata, rxcount);
	}
	__builtin_enable_interrupts();
	for(;txcount||rxcount;){
		txcount -= buffer_put(txdata?txdata:bogus_txdata, txcount);
		rxcount -= buffer_get(rxdata?rxdata:bogus_rxdata, rxcount);
	}

/**
* fill the buffer with some data
* @param data - data to fill
* @param count - count bytes to put in the buffer
* @return bytes in the buffer
*/
uint8_t buffer_put(uint8_t* data, uint8_t count){
uint8_t result;
	result = 0;
	for(;count;--count){
		if(!spi->stat.tbf){
			spi->buf = *data++;
			result++;
		}else break;
	}
	return result;
}
/**
* get data from the buffer
* @param data - data to get
* @param count - count bytes to get from the buffer
* @return bytes in the buffer
*/
uint8_t buffer_get(uint8_t* data, uint8_t count){
uint8_t result;
	result = 0;
	for(;count;--count){
		if(spi->stat.rbf){
			*data++ = spi->buf;
			result++;
		}else break;
	}
	return result;
}

}
besogon вне форума   Ответить с цитированием
Старый 24.02.2017, 22:02   #7
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,314
Вес репутации: 2626/57
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Прием данных по SPI, c 16x8Byte на 8х8Byte переделать

форум не дает править.
конечно же в коде выше ошибка - если txbytes количество меньше rxbytes, то нужно класть в буфер еще фальшивые байты в количестве rxbytes-txbytes.
допишете самостоятельно.

код не проверял - так, в общем виде написал как это можно решать.
-std=gnu11
besogon вне форума   Ответить с цитированием
Старый 24.02.2017, 22:51   #8
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,314
Вес репутации: 2626/57
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Прием данных по SPI, c 16x8Byte на 8х8Byte переделать

Gera82
да, и в первом цикле проверка по условию txcount||(rxcount > BUFFERSIZE)
иначе прерывание все попортит Вам.
besogon вне форума   Ответить с цитированием
Старый 25.02.2017, 18:26   #9
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 35
Сообщений: 502
Вес репутации: 349/37
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: Прием данных по SPI, c 16x8Byte на 8х8Byte переделать

Цитата:
Сообщение от besogon Посмотреть сообщение
форум не дает править.
конечно же в коде выше ошибка - если txbytes количество меньше rxbytes, то нужно класть в буфер еще фальшивые байты в количестве rxbytes-txbytes.
допишете самостоятельно.

код не проверял - так, в общем виде написал как это можно решать.
-std=gnu11

да, и в первом цикле проверка по условию txcount||(rxcount > BUFFERSIZE)
иначе прерывание все попортит Вам.
спасибо за исходник, попробовать сейчас возможности нету, я протестирую в понедельник в железе.

чисто теоретически, должно вот так работать в enchanced buffer mode:
1. загружаю в TX-Buffer ровно 8 байт.
2. жду пока ровно 4 байт уйдут в эфир (SPI1STATbits.SPIBEC != 3)
3. в это же время заполняется RX-Buffer 4 байта, и я быстренько сохраняю эти 4 RX байта, и после сразу пишу новых 4 байта в TX-Buffer. и Так можно этот поток информации бесконечно "без задержек" писать и читать, только прерывании надо будет полностью заблокировать.

будет так работать?
Gera82 вне форума   Ответить с цитированием
Старый 25.02.2017, 18:46   #10
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,314
Вес репутации: 2626/57
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Прием данных по SPI, c 16x8Byte на 8х8Byte переделать

Gera82
ну суть Вы уловили.
1) заблокировать прерывания.
2) загрузить полностью буфер отправки
3) как только в буфере отправки появляется еще место, вынимать данные и забирать данные.

будет так работать? - должно, но вообще все это довольно кривой метод работы с spi как таковым. впрочем, по сути - мб. Вам сделать и забыть.

***
у меня там еще ошибка. я должен еще инкрементировать значение указателя на число задвинутых.


я всегда работал с spi вне реального времени. у меня вообще редко когда возникали задачи, где требовалось бы реальное время, отсутствие задержек и.т.д. старался проектировать системы так, чтобы все это было не нужно.
besogon вне форума   Ответить с цитированием
Старый 25.02.2017, 19:06   #11
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 35
Сообщений: 502
Вес репутации: 349/37
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: Прием данных по SPI, c 16x8Byte на 8х8Byte переделать

Цитата:
Сообщение от besogon Посмотреть сообщение
Gera82
я всегда работал с spi вне реального времени. у меня вообще редко когда возникали задачи, где требовалось бы реальное время, отсутствие задержек и.т.д. старался проектировать системы так, чтобы все это было не нужно.
У меня СПИ работает как https://ru.wikipedia.org/wiki/%D0%9C...BD%D0%B8%D0%B5
в обе стороны SDI и SDO, и скоростью 4Мбита, задержек вообще не должно быть!
Gera82 вне форума   Ответить с цитированием
Старый 25.02.2017, 23:12   #12
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,314
Вес репутации: 2626/57
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Прием данных по SPI, c 16x8Byte на 8х8Byte переделать

http://ww1.microchip.com/downloads/e...tes/01470A.pdf
может быть вообще дешевле на дискретной логике.
besogon вне форума   Ответить с цитированием
Старый 26.02.2017, 13:49   #13
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 35
Сообщений: 502
Вес репутации: 349/37
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: Прием данных по SPI, c 16x8Byte на 8х8Byte переделать

Цитата:
Сообщение от besogon Посмотреть сообщение
http://ww1.microchip.com/downloads/e...tes/01470A.pdf
может быть вообще дешевле на дискретной логике.
да видел этот документ, сразу отпал когда это увидел:
Data and clockcan be directed to the internal SPI module for data
capture at rates of up to 500 kbps.

Мне 4 MBits надо, да и тем более она работает уже на Пик32, просто надо на Пик33ЕП перенести.
Gera82 вне форума   Ответить с цитированием
Старый 27.02.2017, 12:38   #14
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 35
Сообщений: 502
Вес репутации: 349/37
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: Прием данных по SPI, c 16x8Byte на 8х8Byte переделать

я не знаю почему до этого не работала, но сейчас покрайней мере 14 пишет и 14 раз читает, только что в железе отладчиком испытал :
Код:
QF_INT_LOCK();
        sent = recv = 0;
        while(1)
          {
            if(SPI1STATbits.SPIBEC != 7 && sent < len)
            { SPI1BUF = 0xff, sent++;}
            if(SPI1STATbits.SRXMPT == 0  && recv < len)
            {
              read_bytes[recv++] = SPI1BUF;
            }
            if( sent == len && recv == len )
            break;
           } 
        QF_INT_UNLOCK();
Gera82 вне форума   Ответить с цитированием
Старый 27.02.2017, 12:48   #15
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,314
Вес репутации: 2626/57
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Прием данных по SPI, c 16x8Byte на 8х8Byte переделать

Gera82
может быть прерывания не были запрещены.
besogon вне форума   Ответить с цитированием
Старый 27.02.2017, 14:26   #16
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 35
Сообщений: 502
Вес репутации: 349/37
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: Прием данных по SPI, c 16x8Byte на 8х8Byte переделать

Цитата:
Сообщение от besogon Посмотреть сообщение
Gera82
может быть прерывания не были запрещены.
может быть, разбираться не хочу работает да и ладно
Gera82 вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
подключение магнитолы Sergey1 Общетехнические вопросы 10 27.12.2007 22:39
Помогите, пожалуйста, найти ошибку в коде Катя Микроконтроллеры других производителей 26 08.12.2007 14:58
проблемка с PIC16F628A bereg_ok Продукция MICROCHIP 72 07.09.2007 11:00


Часовой пояс GMT +3, время: 09:31.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot