Launchpad MSP430G2553 + Nokia 3310 LCD

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Родился
Сообщения: 3
Зарегистрирован: Вс фев 03, 2013 02:12:52

Сообщение Stallman »

Здравствуйте помучившись с подключением дисплея от Nokia 3310 к Launchpad. И так его и не подключив, решил обратиться за советом.
Суть проблемы такова дисплей никак не хочет что либо показать.
Подключил я его вот так:
Дисплей МК
1.VDD VDD
2.SCK P1.5
3.SDIN P1.7
4.D/C P1.4
5.SCE P1.3
6.GND GND
7.VOUT Через конденсатор(2.2мкФ) на землю
8.RES P2.0

Ну и исходный код выглядит вот так.
#include "io430.h"

#define SCLK BIT5
#define SIMO BIT7
#define CS BIT3
#define RES BIT0
#define DC BIT4
#define SOMI BIT6
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer

UCB0CTL1 = UCSWRST;

P1DIR |= CS +DC;
P2DIR |= RES;
P1SEL |= SOMI + SIMO + SCLK;
P1SEL2 |= SOMI + SIMO + SCLK;

UCB0CTL0 |= UCCKPH + UCMSB + UCMST + UCSYNC;
UCB0CTL1 |= UCSSEL_2;
UCB0CTL1 &= ~UCSWRST;

P1OUT |= DC;

P1OUT |= CS;

P2OUT &=~RES;
__delay_cycles(75);
P2OUT |= RES;

UCB0TXBUF = 0x21;
while(!(IFG2 & UCB0TXIFG));
UCB0TXBUF = 0x10;
while(!(IFG2 & UCB0TXIFG));
UCB0TXBUF = 0x20;
while(!(IFG2 & UCB0TXIFG));
UCB0TXBUF = 0x0С;


__delay_cycles(75);
P1OUT |= DC;
for(int j=0;j<15;j++);
UCB0TXBUF=0xFF;

}


Может быть кто нибудь сталкивался с подобной проблемой или я где-то накосячил, подскажите в какую сторону смотреть.
Заранее благодарен.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3793
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Я с этим дисплеем не работал, но что бросается в глаза:
1. Коды инициализации это команды, поэтому перед их засылкой D/C должен быть сброшен в 0, а у Вас он 1.
2. Флаг прерывания ТХ следует проверять непосредственно перед посылкой байта в TXBUF а не после. Особенно это отностся к циклу в конце кода, где это проверка вообще отсутствует.
Реклама
Родился
Сообщения: 3
Зарегистрирован: Вс фев 03, 2013 02:12:52

Сообщение Stallman »

Спасибо за ответ. Попробовал поправить код как вы посоветовали, но к сожалению снова увидел пустоту на экране. Мне кажется что вся загвоздка в том что я не правильно работаю с SPI.

Код после правок приобрел такой вид:

Код: Выделить всё

#include "io430.h"

#define SCLK BIT5
#define SIMO BIT7
#define CS BIT3
#define RES BIT0
#define DC BIT4
#define SOMI BIT6
void main(void)
{
 WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer

 UCB0CTL1 = UCSWRST;

 P1DIR |= CS +DC; 
 P2DIR |= RES;
 P1SEL |= SOMI + SIMO + SCLK;
 P1SEL2 |= SOMI + SIMO + SCLK;

 UCB0CTL0 |= UCCKPH + UCMSB + UCMST + UCSYNC; 
 UCB0CTL1 |= UCSSEL_2;
 UCB0CTL1 &= ~UCSWRST;


 P1OUT &=~ DC;
 P1OUT &=~ CS;

 P2OUT &=~RES;
 __delay_cycles(75); 
 P2OUT |= RES;

    while(!(IFG2 & UCB0TXIFG));
UCB0TXBUF = 0x21;
    while(!(IFG2 & UCB0TXIFG));
 UCB0TXBUF = 0x06;
    while(!(IFG2 & UCB0TXIFG));
 UCB0TXBUF = 0x13;
    while(!(IFG2 & UCB0TXIFG));
 UCB0TXBUF = 0xF8;
    while(!(IFG2 & UCB0TXIFG));
 UCB0TXBUF = 0x20;
    while(!(IFG2 & UCB0TXIFG));
 UCB0TXBUF = 0x0C;

 
 P1OUT |= DC;
 for(int j=0;j<15;j++){
   while(!(IFG2 & UCB0TXIFG));
   UCB0TXBUF=0xFF;
 }
 
} 
Друг Кота
Аватара пользователя
Сообщения: 3793
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Я такие программы всегда писал на АСМе и через прерывания. Вот мой код инициализации модуля SPI.
У Вас отсутствует установка регистров UCB0BR0 и UCB0BR1

Код: Выделить всё

        mov.w   #WDTPW+WDTHOLD, &WDTCTL ; stop watchdog timer

        ; clock setup
	mov.b   &CALDCO_8MHZ, &DCOCTL	
	mov.b   &CALBC1_8MHZ, &BCSCTL1 	; set 8 MHz clock 	
	mov.b   #DIVS_1, &BCSCTL2  	; SMCLK=DCO/2	

        ; SPI setup for eUSCI_B0        
        mov.b   #UCSSEL_2+UCSWRST, &UCB0CTL1  ; keep SPI module in reset  
        mov.b   #UCMSB+UCCKPH+UCMST+UCSYNC, &UCB0CTL0
        mov.b   #1, &UCB0BR0            ; clock division factor (1:1)
        clr.b   &UCB0BR1
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 3
Зарегистрирован: Вс фев 03, 2013 02:12:52

Сообщение Stallman »

И снова нету результат. Перепроверил подключение, ещё раз перечитал datasheet на МК и диплей, проверил что бы всё точно соответствовало им, но всё равно вижу пустоту. У меня совершенно не осталось идей почему дисплей не хочет работать.

Код немного видоизменился:

Код: Выделить всё

#include "io430.h"

#define SCLK BIT5
#define SIMO BIT7
#define CS BIT3
#define RES BIT0
#define DC BIT4
#define SOMI BIT6
void main(void)
{
 WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
 
 P2DIR |= RES;
 
 P2OUT &=~RES;
 __delay_cycles(75); 
 P2OUT |= RES;
 
// UCB0CTL1 &= ~UCSWRST;
 BCSCTL1 = CALBC1_8MHZ;            // 1MHz clock
 DCOCTL = CALDCO_8MHZ;
 
 BCSCTL2 |= DIVS_1;
 
 P1DIR |= CS +DC; 
 P1SEL |= SOMI + SIMO + SCLK;
 P1SEL2 |= SOMI + SIMO + SCLK;

 UCB0CTL1 = UCSSEL_2+UCSWRST;
 UCB0CTL0 |= UCCKPH + UCMSB + UCMST + UCSYNC; 
 
 
 UCB0BR0 |= 0x10;                         
 UCB0BR1 = 0;
 
 UCB0CTL1 &= ~UCSWRST;


 P1OUT &=~ DC;
 P1OUT &=~ CS;

    while(!(IFG2 & UCB0TXIFG));
UCB0TXBUF = 0x21;
    while(!(IFG2 & UCB0TXIFG));
 UCB0TXBUF = 0x06;
    while(!(IFG2 & UCB0TXIFG));
 UCB0TXBUF = 0x13;
    while(!(IFG2 & UCB0TXIFG));
 UCB0TXBUF = 0xF8;
    while(!(IFG2 & UCB0TXIFG));
 UCB0TXBUF = 0x20;
    while(!(IFG2 & UCB0TXIFG));
 UCB0TXBUF = 0x0C;

 
 P1OUT |= DC;
 for(int j=0;j<15;j++){
   while(!(IFG2 & UCB0TXIFG));
   UCB0TXBUF=0xFF;
 }
 while (1)
 {
 }
} 
Реклама
Ответить

Вернуться в «Периферия»