реклама на сайте
подробности

 
 
> Помогите разобраться с микросхемой работающей по SPI
zheka
сообщение Jan 25 2011, 15:11
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Господа, разбираюсь с микросхемой TLE7230R. Она управляется по SPI, даташит прилагаю внизу.

Я конечно плохо разбираюсь в SPI, в основном приходилось пользоваться готовыми библиотеками. А как столкнулся с голым даташитом - обломал зуб. У меня почему-то складывается ощущение, что с этой микросхемой придется городить аппаратный SPI...

В общем делаю я так:
Код
ubyte Send2SPI_TLE(ubyte data, unsigned char chip) // микросхем несколько, в дальнейшем планирую использовать chip для указания микросхемы.
//Передает по SPI данные data и возвращает принятый байт
{
  CS_1=0;
  SPDR = data;
  while(!(SPSR & (1<<SPIF)));
  CS_1 = 1;
  return SPDR;


//****************

}


ubyte SendWord2SPI_TLE(uword data)
//Отсылает двухбайтовое число по SPI младшим байтом вперед
//возвращает последний принятый байт
{
  Send2SPI_TLE(data,1);
  return Send2SPI_TLE(data>>8,1);
}

................
// в некоей функции инициализирую SPI
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<CPOL)|(1<<CPHA); //

void main()

uword TLE_WORD;

TLE_WORD=SendWord2SPI_TLE(0b1100000111010101); // пытаюсь записать (код записи 11) по адресу 001 (регистр MAP) число 11010101
TLE_WORD=SendWord2SPI_TLE(0b0100000100000000); // пытаюсь прочитать (код чтения  01) по адресу 001 (регистр MAP). Чему должны равняться ненужные младшие 8 бит - понятия не имею.

    
// А дальше - не смейтесь - для наглядности вывожу содержимое 16-тибитного слова TLE_WORD в виде цветных квадратиков.
for(i=0;i<16;i++)
   {
FillRect(100+i*40,60,120+i*40,80,clWhite,clWhite);
     if  ((TLE_WORD & (1<<i))!=0)
     FillRect(100+i*40,100,120+i*40,120,clRed,clRed); else FillRect(100+i*40,100,120+i*40,120,clBlue,clBlue);
          
   }


В итоге старшие 8 бит равны единицам, младшие - нулям, что бы я не писал в тот регистр.

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



P.S. Работаю в CodeVision 2, контроллер ATmega32 частота 8 МГц

Сообщение отредактировал zheka - Jan 25 2011, 15:15
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
-=Женек=-
сообщение Jan 27 2011, 12:10
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131



Вот выдержка из даташита:
Цитата
SCLK - Serial Clock. The serial clock pin clocks the internal SPI shift register of the TLE 7230 R. The
serial input (SI) accepts data into the input SPI shift register on the falling edge while the serial output
(SO) shifts diagnostic information out of the SPI shift register on the rising edge of serial clock. It is
essential that the SCLK pin is in a logic low state whenever chip select (CS) makes any transition.


микросхема принимает данные на падающем фронте, стало быть контроллер должен их выставить на возрастающем фронте.
микросхема отправляет данные на нарастающем фронте, значит контроллер должен принять их на падающем.

Под эти требования подходит либо CPOL = 1, CPHA = 0, либо CPOL = 0, CPHA = 1. Но насколько я знаю режимы не взаимозаменяемы, то есть если одна из микросхем CPOL = 1, CPHA = 0, то и другая должна быть CPOL = 1, CPHA = 0.
А как из этого описания дальше понять какой из режимов применить?

P.S. Я так понял, что если CPOL и СPHA на одной микрсхеме единицы, а на другой нули - то будут проблемы с чтением состояния линии. Если же CPOL=1 а CPHA=0, а на другой микросхеме наоборот, то данные будут читаться, но со смещением на 1 бит. Я правильно понял?

На Fig6 и Fig7 одно и то же, а вот линии обозваны по разному - SO и SI. Там ошибка что ли?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 14:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01385 секунд с 7
ELECTRONIX ©2004-2016