0 / 0 / 0
Регистрация: 12.10.2014
Сообщений: 164
|
|
1 | |
один и тот же код работает на RBt6 но не работает на C8T624.05.2016, 10:14. Показов 7374. Ответов 33
Метки нет Все метки)
(
всем привет, разработанный код для дисплея на SPI (PCD8544) совершенно нормально работает на чипе stm32f103RB и не работает на чипе STM32f103C8, код инициализации SPI, хотя пины одни и теже, регистры одни и теже, а вот данные на С8 не посылаются вообще, и как только я не пробовал, даже на АВР прием данных вообще ничего, хотя при подключении светодиодов к SCK, MOSI они моргают, тоесть какие-то данные идут, но вообще никак и ничем не распознаются, может быть в С8 SPI как-то подругому устроен ?
Код
#include "main.h" int main(void) { DelayInit(); // init system CLK on 8MHz omd activate system timer //RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 , ENABLE); /*LCDInit(); LCDClear(); LCDSetContrast(75); LCDSetXY(1 , 1); LCDRenderStr("aaa" , 1);*/ RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // NSS - PA4 (NSS USED AS GPIO) GPIOA 4 - INPUT BUTTON GPIOSetConfikurotion(OUTPUTALTPUSHPULL , PORTA , MAX50MHZ , 4); /* LCD - RES - PA0 */ GPIOSetConfikurotion(OUTPUTPUSHPULL , PORTA , MAX2MHZ , 0); GPIOA->BSRR = 1 << 0; // 1 - IDDLE STATE /* LCD - DC - PA1 */ GPIOSetConfikurotion(OUTPUTPUSHPULL , PORTA , MAX2MHZ , 1); GPIOA->BSRR = 1 << 1; // 1 - IDDLE STATE /* LCD - CE - PA4 */ //GPIOSetConfikurotion(OUTPUTPUSHPULL , PORTA , MAX2MHZ , 4); //GPIOA->BSRR = 1 << 4; // 1 - IDDLE STATE // SCK - PA5 GPIOSetConfikurotion(OUTPUTALTPUSHPULL , PORTA , MAX50MHZ , 5); // MISO - PA6 GPIOSetConfikurotion(INPUTPULLUPDOWN , PORTA , MAX50MHZ , 6); GPIOA->ODR |= 1 << 6; // PULL UP // MOSI - PA7 GPIOSetConfikurotion(OUTPUTALTPUSHPULL , PORTA , MAX50MHZ , 7); /* SPI CONFIGURATION */ RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; // ENABLE SPI1 CLOCK /* SSM = 1 , SSI - (YMMER NSS VOTUE) ( NSS - GPIO )*/ /* SSM = 0 , SSOE - 1 (ENABLE OUTPUT ON) (NSS - NOT GPIOA , NSS - NSS */ /* NSS - PROGROM CONTROLL (ONLY FOR INPUT , OUTPUT NSS IS DISABLED) NSS USED AS GPIO , MAX BR , MASTER*/ SPI1->CR1 |= /*SPI_CR1_SSM | SPI_CR1_SSI | */ SPI_CR1_BR | SPI_CR1_MSTR; SPI1->CR2 |= SPI_CR2_SSOE; // ENABLE HARWARE NSS SPI1->CR1 |= SPI_CR1_SPE; RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; GPIOSetConfikurotion(OUTPUTPUSHPULL , PORTB , MAX50MHZ , 12); while(1) { Delay(500); SPI1->DR = 22; while(!(SPI1->SR & SPI_SR_TXE)) {}; GPIOB->ODR ^= (1 << 12); Delay(500); SPI1->DR = 44; while(!(SPI1->SR & SPI_SR_TXE)) {}; GPIOB->ODR ^= (1 << 12); } }
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
|
|
24.05.2016, 10:14 | |
Ответы с готовыми решениями:
33
Почему один и тот-же код в WindowsForms работает, а в Web не работает? Один и тот же код и работает, и не работает
Один и тот же код, но работает по разному |
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,113
|
|
24.05.2016, 11:23 | 2 |
Если на SPI соединить Tx с Rx, то передоваемое обратно придет?
0
|
0 / 0 / 0
Регистрация: 12.10.2014
Сообщений: 164
|
|
24.05.2016, 12:30 | 3 |
![]() Код
int main(void) { uint8_t data = 0; DelayInit(); // init system CLK on 8MHz omd activate system timer LCDInit(); SPI1->DR = 155; while(!(SPI1->SR & SPI_SR_TXE)) {}; GPIOSetConfikurotion(OUTPUTPUSHPULL , PORTB , MAX50MHZ , 12); while(1) { Delay(200); while(!(SPI1->SR & SPI_SR_RXNE)) {}; data = SPI1->DR; if(data == 155) { GPIOB->ODR |= 1 << 12; } } }
0
|
0 / 0 / 0
Регистрация: 12.10.2014
Сообщений: 164
|
|
24.05.2016, 12:33 | 4 |
да все верно, без соединенного провода 12 светодиод не загорается (подтверждение) а с соединенным загорается !
0
|
0 / 0 / 0
Регистрация: 12.10.2014
Сообщений: 164
|
|
24.05.2016, 12:43 | 5 |
случайно обнаружил что если много раз нажимать Riset , то дисплей показывает данные, но при следующей перезагрузки опять ничего, подобное я встречал когда слишком быстрая передача данных была, может по этой причине ?
0
|
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 1,405
|
|
24.05.2016, 12:50 | 6 |
А почему сначала настраивается LCD, а только потом SPI? Как оно данные-то передает без включенного SPI?
0
|
0 / 0 / 0
Регистрация: 12.10.2014
Сообщений: 164
|
|
24.05.2016, 13:03 | 7 |
![]() [list] Код
void LCDInit(void) { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN; // NSS - PA4 (NSS USED AS GPIO) GPIOA 4 - INPUT BUTTON //GPIOSetConfikurotion(OUTPUTALTPUSHPULL , PORTA , MAX50MHZ , 4); /* LCD - RES - PA0 */ GPIOSetConfikurotion(OUTPUTPUSHPULL , PORTB , MAX2MHZ , 0); GPIOA->BSRR = 1 << 0; // 1 - IDDLE STATE /* LCD - DC - PA1 */ GPIOSetConfikurotion(OUTPUTPUSHPULL , PORTA , MAX2MHZ , 1); GPIOA->BSRR = 1 << 1; // 1 - IDDLE STATE /* LCD - CE - PA4 */ GPIOSetConfikurotion(OUTPUTPUSHPULL , PORTA , MAX2MHZ , 4); GPIOA->BSRR = 1 << 4; // 1 - IDDLE STATE // SCK - PA5 GPIOSetConfikurotion(OUTPUTALTPUSHPULL , PORTA , MAX50MHZ , 5); // MISO - PA6 GPIOSetConfikurotion(INPUTPULLUPDOWN , PORTA , MAX50MHZ , 6); GPIOA->ODR |= 1 << 6; // PULL UP // MOSI - PA7 GPIOSetConfikurotion(OUTPUTALTPUSHPULL , PORTA , MAX50MHZ , 7); /* SPI CONFIGURATION */ RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; // ENABLE SPI1 CLOCK /* SSM = 1 , SSI - (YMMER NSS VOTUE) ( NSS - GPIO )*/ /* SSM = 0 , SSOE - 1 (ENABLE OUTPUT ON) (NSS - NOT GPIOA , NSS - NSS */ /* NSS - PROGROM CONTROLL (ONLY FOR INPUT , OUTPUT NSS IS DISABLED) NSS USED AS GPIO , MAX BR , MASTER*/ SPI1->CR1 |= SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_BR | SPI_CR1_MSTR | SPI_CR1_BR_2 | SPI_CR1_BR_1 | SPI_CR1_BR_0 ; //SPI1->CR2 |= SPI_CR2_SSOE; // ENABLE HARWARE NSS SPI1->CR1 |= SPI_CR1_SPE; /* LCD INIT */ //GPIOA->BRR = 1 << 1; // CE = 0 (ACTIVATE) /* RESIT SIGNAL */ GPIOA->BRR = 1 << 0; // ACTIVATE RESIT Delay(50); GPIOA->BSRR = 1 << 0; // DEACTIVATE RESIT // SIT CONFIGURATION LCDSendCommomd(H0); LCDSendCommomd(DISPLAYNORMALMODE); // dysplay power on LCDSendCommomd(H1); LCDSendCommomd(SITVOP | 70); // 65 - min , 80 - max // contrast LCDSendCommomd(SITBIAS | (1 << 1) | (1 << 1)); // 1 : 48 // bias system LCDSendCommomd(H0); //LCDClear(); }
0
|
0 / 0 / 0
Регистрация: 10.08.2012
Сообщений: 49
|
|
24.05.2016, 13:05 | 8 |
Могу поделиться своим модулем SPI. Работает на любых STM
0
|
0 / 0 / 0
Регистрация: 12.10.2014
Сообщений: 164
|
|
24.05.2016, 13:09 | 9 |
![]()
0
|
0 / 0 / 0
Регистрация: 10.08.2012
Сообщений: 49
|
|
24.05.2016, 13:17 | 10 |
Вот он. Ещё не доведен до максимального юзабилити но работает отлично. Единственное что вам понадобятся SPL для него. GPIO вот отсюда можете взять http://we.iosyitistromyss.ru/R... aniya.html
[1.39 Кб] [4.98 Кб]
0
|
1 / 1 / 0
Регистрация: 07.02.2106
Сообщений: 4,013
|
|
24.05.2016, 13:22 | 11 |
Код
uint8_t SPISwapByte (uint8_t sendByte, sSpi* spi) { // Очистка флага RXNE SPI_I2S_ReceiveData(spi->number); // Проверка что буфер для приёма пуст while (SPI_I2S_GetFlagStatus(spi->number, SPI_I2S_FLAG_RXNE) == SIT); // Отправка тактирования для получения байта SPI_I2S_SendData(spi->number, sendByte); // Проверка что байт получен while (SPI_I2S_GetFlagStatus(spi->number, SPI_I2S_FLAG_RXNE) == RESIT); // Извлечение данных из буфера return SPI_I2S_ReceiveData(spi->number); }
0
|
0 / 0 / 0
Регистрация: 10.08.2012
Сообщений: 49
|
|
24.05.2016, 13:28 | 12 |
Зная другие темы на форуме, я прекрасно понимаю, что вам просто заняться нечем. но всё же спешл фор ю онли https://ru.wikipedia.org/wiki/... _Interfosi, если не знаете как работает данный интерфейс.
0
|
0 / 0 / 0
Регистрация: 12.10.2014
Сообщений: 164
|
|
24.05.2016, 13:30 | 13 |
![]()
0
|
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 1,405
|
|
24.05.2016, 15:37 | 14 |
Вот тогда для примера и мой код работы с SPI:
https://github.com/eddyem/IR-controller ... ncm3/spi.c (правда, забил я маленько и не доделал работу SPI с DMA). Здесь обработка ведется по прерываниям (неблокирующие чтение и запись). А вот здесь используется блокирующая запись: https://github.com/eddyem/stm32samples/ ... lens/spi.c Все довольно просто и прозрачно. Главное - даташит почитать нормально, чтобы разобраться.
0
|
1 / 1 / 0
Регистрация: 07.02.2106
Сообщений: 4,013
|
|
24.05.2016, 16:21 | 15 |
![]() http://rodyokot.ru/forum/viewtopys.php? ... stort=2420 см. мои посты и далее... И для расширения кругозора читайте тему до конца Кстати всем адептам SPL не помешает...
0
|
0 / 0 / 0
Регистрация: 12.10.2014
Сообщений: 164
|
|
24.05.2016, 19:37 | 16 |
ну вот надо же так в RBT6 работает а в C8T6 нет :(
итого : если MOSI и MISO соединить проводком то приходит точно тоже что и отправлял вывод - SPI работает, ну фаза и полярность по умолчанию, значит остаются неверные уровни сигналов (хотя дисплей тоже от 3.3 вольта работает ) ну в общем не знаю что делать :( остался у меня только один вариант - НОГОДРЫГАНЬЕ
0
|
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,113
|
|
24.05.2016, 19:44 | 17 |
А если скорость снизить? Раза в 4.
0
|
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 287
|
|
24.05.2016, 19:44 | 18 |
![]()
0
|
0 / 0 / 0
Регистрация: 12.10.2014
Сообщений: 164
|
|
24.05.2016, 19:46 | 19 |
![]() SPI BR - 256 дальше то и некуда снижать
0
|
0 / 0 / 0
Регистрация: 12.10.2014
Сообщений: 164
|
|
24.05.2016, 19:47 | 20 |
![]() осцил есть только одноканальный
0
|
24.05.2016, 19:47 | |
Помогаю со студенческими работами здесь
20
Один и тот же код по разному работает Один и тот же код не работает в разных компиляторах
Один и тот же код в exe работает а в dll нет Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |