Jump to content
SerYoga72

MSP430. Грамотная реализация програмного SPI

Recommended Posts

Приветствую всех.

Подскажите не совсем программисту (или совсем не программисту) как грамотно реализовать программный SPI. МК CC430F5137 + OLED дисплей WEH000802A от Winstar. Данные 10 бит. Аппаратный в контроллере позволяет только 8, выход свой написать. Написал, но мне это не нравиться, знаю что можно намного проще, но не нахожу решения. Да и как то странно с портами в этом контроллере работается, нельзя (или не знаю как) данные напрямую в порт кидать, типа P1.0 = 1; А только BITами оперировать??? Вот что у меня получилось, смеяться разрешается ))

//  Обработчик дисплея
//
// Маразм для програмного SPI
void SCL(uchar b) { if (b==1) (P1OUT |= BIT7); else P1OUT &= ~BIT7; } //Строб
void CSB(uchar b) { if (b==1) (P1OUT |= BIT4); else P1OUT &= ~BIT4; } //Выбор чипа
void SDI(uchar b) { if (b==1) (P1OUT |= BIT6); else P1OUT &= ~BIT6; } //Передаваемые данные
void SDO(uchar b) { if (b==1) (P1OUT |= BIT5); else P1OUT &= ~BIT5; } //Принимаемые данные




// Вывод управляющей команды для дисплея
void WriteCMD(uchar CMD)
{
  uchar i;
  CSB(0);
  SDI(0);                                      
  _delay_cycles(100);
  SCL(0);
  _delay_cycles(100);
  SCL(1);
  SDI(0);                                      
  _delay_cycles(100);
  SCL(0);
  _delay_cycles(100);
  SCL(1);
  _delay_cycles(100);
  for(i=0;i<8;i++)
  {
    uchar t = ((CMD>>(7-i)) & 0x01);  // Как уйти от переменной t ????? 
    SDI(t);
    SCL(0);
    _delay_cycles(100);
    SCL(1);
    _delay_cycles(100);
  }
  CSB(1);
}

/*============================================
Вывод одиночного символа на дисплей
============================================*/
void WriteOneDAT(uchar DAT)
{
  uchar i;;
  CSB(0);
  SDI(1);                                      
  _delay_cycles(100);
  SCL(0);
  _delay_cycles(100);
  SCL(1);
  SDI(0);                                      
  _delay_cycles(100);
  SCL(0);
  _delay_cycles(100);
  SCL(1);
  _delay_cycles(100);
  for(i=0;i<8;i++)
  {
    uchar t =((DAT>>(7-i)) & 0x01);
    SDI(t);
    SCL(0);
    _delay_cycles(100);
    SCL(1);
    _delay_cycles(100);
  }
  CSB(1);
}

Технически разница между Командой и Данными в первом бите SDI и объединить эти две функции наверно не проблема, но я уверен что это можно написать как то грамотнее ...  Как в этом контроллере с портами работать кроме как P1OUT |= BIT1 ??? Нельзя как то типа P1OUT_1 = 1;  ?? Где то в буржуйской литературе мапинг какой то проскакивал, но там я вообще не вьехал про что это, для чего это....

Заранее Всем Благодарен.

 

 

 

 

 

Share this post


Link to post
Share on other sites

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

// маска последнего выводимого бита
#define LAST_BIT	(1<<10)
// макрос SDI() переделать так, чтобы он возвращал bool-уровень на пине
  
uint16_t spi_io(uint16_t data){
	uint16_t result = 0;
	for(uint16_t mask = 1; mask <= LAST_BIT; mask <<= 1){
		SDO(data & mask);
		SCL(1);
		result |= SDI() ? mask : 0;
		SCL(0);
	}
	return result;
}

Вам лишь надо уточнить, в том ли направлении в моём коде идет сдвиг и в нужном ли режиме устанавливается SCK.

Share this post


Link to post
Share on other sites

Я понимаю, но как я сказал - я совсем не программист, когда то давно писал на ассемблере.  Вот например Ваш код мне сложен для понимания, я его конечно раскурю, я Вам благодарен, но придумать я бы такое не смог.

Еще раз благодарю.

Еще бы кто по работе с портами просветил...

Share this post


Link to post
Share on other sites

Тестирование литиевых батареек Fanso в нормальных условиях

Компания Компэл, эксклюзивный дистрибьютор компании Fanso, предлагает широкий перечень ЛХИТ, позволяющий подобрать элемент питания, в наибольшей степени соответствующий конкретным требованиям. Для тестирования параметров, указанных в Datasheet, специалисты Компэл организовали в апреле 2019 г. полугодовой тест на постоянный разряд в нормальных условиях четырех наиболее популярных моделей литий-тионилхлоридных и литий-диоксидмарганцевых батареек Fanso.

Посмотреть результаты первого среза

Только что, SerYoga72 сказал:

Еще бы кто по работе с портами просветил...

А что с ними не так?

Share this post


Link to post
Share on other sites

Пример Порт 1 Пин 0

P1OUT |= BIT0 ;  // P1.0 установили в единицу

P1OUT &= ~BIT0; // Установили в ноль

Это хорошо для моргания одним светодиодом, но часто проще сразу записать 1 или 0 в нужный порт, типа

P1.0 = 1;  // Неужели подобное невозможно реализовать в MSP430 ??

Я как только не пробовал... И нигде не нахожу. Для реализации SPI пришлось создать четыре функции, я считаю это бредом каким то, если честно.

// Маразм для програмного SPI
void SCL(uchar b) { if (b==1) (P1OUT |= BIT7); else P1OUT &= ~BIT7; } //Строб
void CSB(uchar b) { if (b==1) (P1OUT |= BIT4); else P1OUT &= ~BIT4; } //Выбор чипа
void SDI(uchar b) { if (b==1) (P1OUT |= BIT6); else P1OUT &= ~BIT6; } //Передаваемые данные
void SDO(uchar b) { if (b==1) (P1OUT |= BIT5); else P1OUT &= ~BIT5; } //Принимаемые данные

И кстати, в Вашей версии реализации вот этот кусок почему то не работает: 

	SDO(data & mask);

Еще сильно не думал, но даже если data имеет значения 0xFFFF,   SDO все равно имеет значение 0, всегда ноль....  Даже примерно не могу понять почему...

Я использую CCS.  И кстати булевых переменных тут что то же нет? Обявления типа bool var;  выдает ошибку неопределенный тип.... 

Share this post


Link to post
Share on other sites

Новое бюджетное семейство микроконтроллеров STM32G0 и планы его развития

Семейство STM32G0 сочетает в себе лучшие качества представителей семейств STM32F0 и STM32L0 - относительно высокую производительность и низкое энергопотребление. Модели STM32G0 имеют упрощенную схему питания, улучшенную периферию, систему тактирования и быстрые порты в/в, доп.средства защиты ПО, повышенную устойчивость к статическим разрядам, широкий ассортимент корпусов, обновленные пакеты библиотек для STM32CubeMX. STMicroelectronics планирует развивать новое семейство.

Подробнее...

Posted (edited)
41 минуту назад, SerYoga72 сказал:

И кстати, в Вашей версии реализации вот этот кусок почему то не работает

потому что данные data и mask 16-битные, а функцию вы определили с 8-битным параметром. и вообще, я рассчитывал, что SDO будет макросом, которому в общем-то плевать на разрядность...

41 минуту назад, SerYoga72 сказал:

P1.0 = 1;  // Неужели подобное невозможно реализовать в MSP430 ??

Такое вообще нельзя реализовать на языке Си - это вы насмотрелись "кода" на недосишном языке CVAVR. Если сильно-сильно хочется именно подобной записи, то придется попариться со структурами и указателями... Но я вам не буду этого советовать - у вас и так проблем хватает.

41 минуту назад, SerYoga72 сказал:

P1OUT |= BIT0 ;  // P1.0 установили в единицу

P1OUT &= ~BIT0; // Установили в ноль

А вот это самая что ни на есть кошерная запись для Си. Именно так и правильно манипулировать битами.

#define SDO(x)	do{ if(x) P1OUT |= BIT5; else P1OUT &= ~BIT5; } while(0)
#define SDI()	(P1IN & BIT7)
#define SCK(x)  do{ if(x) P1OUT |= BIT6; else P1OUT &= ~BIT6; } while(0)

Как-то так всего-навсего... Я не знаком с вашей платформой, но для SDI по-моему нельзя использовать порт вывода P1OUT... я написал P1IN, хотя не уверен, что это правильно...

Edited by ARV

Share this post


Link to post
Share on other sites

Заставил я это работать )). Благодарю.  Теперь вопрос для повышения общего уровня образованности так сказать, ну если Вы не против.:

Вы предлагаете такую реализацию:

18 часов назад, ARV сказал:

#define SDO(x) do{ if(x) P1OUT |= BIT5; else P1OUT &= ~BIT5; } while(0)

#define SDI() (P1IN & BIT7)

#define SCK(x) do{ if(x) P1OUT |= BIT6; else P1OUT &= ~BIT6; } while(0)

У меня реализовано так:

void SCL(uchar b) { if (b) (P1OUT |= BIT7); else P1OUT &= ~BIT7; } //Строб
void CSB(uchar b) { if (b) (P1OUT |= BIT4); else P1OUT &= ~BIT4; } //Выбор чипа
void SDO(uint b)  { if (b) (P1OUT |= BIT6); else P1OUT &= ~BIT6; } //Передаваемые данные

Чем Ваша реализация лучше? (Вопрос не для спора а для понимания) И для чего цикл do-while ?

По поводу SDI (принимаемых данных) Вы правы, просто я данные пока не собирался принимать и написал на автопилоте P1OUT.

Заранее благодарен.

P.S. Как уменьшить межстрочный интервал в форуме?

Share this post


Link to post
Share on other sites

Я кажется понял, если я использую #define то при компиляции данный код вставляется в место вызова и перехода не происходит, а в моем случае происходит переход в функцию и возврат из нее, то есть так мы экономим процессорные тики, я правильно понял?

А для чего do-while ?

Share this post


Link to post
Share on other sites

Да, макросы повышают быстродействие, ведь требования к SPI обычно "чем быстрее, тем лучше". А do-while - это кошерная перестраховка на всякий случай. Во многих случаях можно и без этого, и данный случай как раз такой, просто делаю по привычке. Обычно do-while актуально для  макросов, состоящих из нескольких операторов, и в данном случае не дает никаких преимуществ, т.к. оператор один.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By mine1
      Наткнулся на библиотеку hal_xxx.c от TI для MSP430.
      Ни как не могу найти, где взять взять полное семейство этих библиотек. Поделитесь ссылочной  
      hal_UCS.c
    • By Isaev_ivan
      Доброго времени суток всем!
      Недавно возникла потребность передачи данных из микроконтроллера в ПК. Написал код на ассемблере, опираясь на Code_examples от TI, и то, что получилось, приведено ниже:
      #include "msp430F1232.h"
      RSEG CSTACK
      DS16 0
      RSEG CODE
      ;---------------------------------------------------------------------
      ; Установка тактирования от кварца
      ;---------------------------------------------------------------------
      RESET mov #SFE(CSTACK),SP
      mov #WDTPW+WDTHOLD,&WDTCTL ;OSTANOVKA WDT
      BIC #OSCOFF, SR ; tAKTIROVANIE OT KVARCA
      BIS.B #XTS, BCSCTL1
      L1 BIC.B #OFIFG, &IFG1
      MOV #0FFh, R15
      L2 DEC R15
      JNZ L2
      BIT.B #OFIFG, &IFG1
      JNZ L1
      BIS.B #SELM_3, &BCSCTL2
      ;--------------------------------------------------------------------
      ; Инициализация USART
      ;--------------------------------------------------------------------
      mov.b #200,R7
      bis.b #SWRST,&UCTL0;
      bis.b #030h,&P3SEL; P3.4,5 - USART
      bis.b #UTXE0+URXE0,&ME2; Включение передачи и приема
      bis.b #CHAR, &UCTL0; Формат данных 8-разрядный
      mov.b #SSEL0, &UTCTL0; UCLK=ACLK
      mov.b #0100b,&UBR00; 5MHz/19200 = 260.4 = 100000100b
      mov.b #0001b,&UBR10;
      mov.b #0000, &UMCTL0; Без модуляции
      bic.b #SWRST,&UCTL0; Сброс USART не включен
      bis.b #URXIE0+UTXIE0,&IE2
      bis.b #UTXIFG0,&IFG2; Флаг гтовности к прерыванию
      Loop bis.w #LPM3+GIE,SR
      nop
      jmp Loop
      ;-------------------------------------------------------------------
      USART0TX_ISR;
      ;-------------------------------------------------------------------
      mov.b R7, &TXBUF0;
      reti
      ;--------------------------------------------------------------------
      ; Векторы прерываний
      ;--------------------------------------------------------------------
      COMMON INTVEC
      ORG RESET_VECTOR
      DW RESET
      ORG USART0TX_VECTOR
      DW USART0TX_ISR
      END.
      Из программы видно, что я просто хочу передать содержимое R7 в ПК. Трудность заключается в том, что это значение передается не всегда. Запускаю программу, которая считывает информацию с com порта (программа работает 100% правильно), она в тестовый файл записывает значение 200(правильное значение). В следующий раз, после перезапуска программы, в текстовый файл она записывает величину 14. Потом снова 200. И я не пойму, что с ней происходит! Кто знает, отзовитесь пожалуйста
    • By yang
      I am Chinese student, now studying in St. Petersburg. I'm here one year, so i am not very good in Russian,written in English. I would like to know some new friends like programming and design, I want to participate in some professional game in Russia or complete some projects with my friends. If you need, I can help you buy some cheap things in China.If you have spare time or want to learn Chinese, hope you can help me learn the Russian language.This is part of my profile.




    • Guest Duck
      By Guest Duck
      Стоит изучать MSP430?
      Как я понимаю cortex-m он превосходит только энергоэффективностью? Или уже нет?
    • By tim-ua
      Я совсем новичок в МК, столкнулся с проблемой при подключении msp430 к bluetooth модулю. Модуль раньше работал на ардуине но с этой платой ни как не заводится.
      Подключить модуль к планшету получается (в терминале на планшете приходят обратно вводимые символы если замкнуть на модуле RX и TX). Но как дальше его подключить к msp430 я не понял. Пробовал так: P1.1 -> TX, p1.2 -> RX , пробовал менять комбинацию перемычек SW uart \ HW uart.
      Прошивка:

      void setup() { Serial.begin(9600); } void loop() { Serial.println("Test"); delay(100); }
      Возможно ли их вообще подключить?

  • Сообщения

    • HI-FI - высокая верность, предусматривается и динамический диапазон ! Песня в пол голоса, рояль или аккордеон в пол накала, представление о звуке дает, но это не естественное звучание и к высокой верности отношения не имеет ! 
    • Глубоко уважаемые обитатели форума...  Прошу помочь разобраться как работает обратная связь в УМЗЧ.Конкретно ланзароподобных которыми пичкают автоусилители...Интересует твик имеющегося автоусилителя блаупункт гта470. Конечно есть статьи как это сделать.  Но там не говорится о том какой элемент за что отвечает и что будет если изменять их номиналы в ту или иную сторону.. Расскажу что сам нашел: в данной цепи есть керамика на 100пик шунтирующая резистор на 12кОм(как я понял она отвечает за вч диапазон, т.е фильтр высоких частот) если снизить её емкость то получим лучшую отдачу на вч. Ещё есть электролит на 33мкф он отвечает за возможности усилитель играть в НЧ диапазоне. Заменив его на неполярный и увеличив его емкость получим лучшую отдачу на НЧ, а вот самое главное этот резисторы которые задают коэффициент усиления!!! В моем случае их соотношение 1кОм/12кОм что я получу при изменении КУ????  
    • @vg155 Всё так . Но в моем случае эти сигналы по обе стороны от нуля. Нужно сдружить как-то. Типа буфера. Цифрового изолятора.. или черт знает как он там называется. Нашел подобное с двумя питаниями +3.3 . +1.6. Нужно зотя бы - 3.3+3.3.  Без тока собственного потребления. Поможете?!
    • Кажися, у нас на форуме женщин больше, чем кажется, кажися. Смехуечки соответствующие
    • По поводу установки транзисторов УН на общий радиатор, кто что скажет? какие последствия?  
    • Я и вчера не был нытиком. Я и про СССР мало чего плохого сказать могу, и про современную Россию. Больше всего негатива у меня от "переходного периода" - те саме 90-е. Да и тогда я не ныл, а искал способ выжить и прокормить семью. Был у меня период депрессии, когда миллионы были еще - работу потерял... на биржу встал... и начали меня гонять по разным организациям, где требовали работать с утра и пока не скажут "хватит", а зарплату обещали месяца через 3-4 (были тогда задержки). Может, конечно, я и путаю период миллионов и задержек, но смысл в том, что хотели, чтобы я работал задаром. А мне надо было семью кормить. И я дошел до ручки - предложили "устроить" охранником в тюрьму. И я даже медкомиссию прошел (за взятку)... Но когда побывал "на собеседовании", понял, что тюрьма - она для всех тюрьма, с какой стороны решетки ты бы не находился. И признаюсь - был я тогда очень близок к тому, чтобы заныть, даже завыть! Но нашел шабашку и за 3 дня заработал на 2 месяца вперед (починил несколько микроплазменных установок для одной фирмы)  И это меня как-то воодушевило, в тюрьму не пошел, и через 2 месяца нашел нормальную работу. С тех пор не терял больше. Так что я пережил все, практически от сумы до тюрьмы, и не надо меня лечить, что в СССР было хорошо или плохо, или что сейчас хорошо или плохо - я абсолютно точно знаю, КАК на самом деле было и есть. Для тебя только писька, подонок. Ну, в общем, ничего, кроме лжи, и ожидать не приходится... Я маленьким болел часто, и мама меня откармливала черной икрой. Покупала по банке 0,5 литра и кормила - аж до тошноты. Ясное дело, не в магазине - на рынке (или у проводников из Астрахани, что ли - мелкий был, не уделял внимания происхождению этой икры). Причем мама моя растила меня одна, и работала в детском саду, как и сейчас работает. И всякие вонючие подонки могут что угодно врать - мне известна правда. Кстати, недавно купил баночку освежить вкус... То ли она и тогда была невкусная, то ли сейчас говно, но не понравилась совсем. Воспоминания другие...
    • Мультисима нету Почему отсутствует стабилизация? На счет пульсаций вы правы.
×
×
  • Create New...