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

 
 
 
Reply to this topicStart new topic
> Помогите разобраться с микросхемой работающей по 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
XVR
сообщение Jan 26 2011, 08:12
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Во первых - манипуляции с CS_1 перенесите из Send2SPI_TLE в SendWord2SPI_TLE (сейчас у вас SPI сбрасывается в середине между байтами, а не должен)
Проверьте настройку SPI - полярности клоков и места чтения (фиг 6 и 7 в DS на стр 12)

Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Jan 27 2011, 12:10
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 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
rezident
сообщение Jan 27 2011, 12:44
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(-=Женек=- @ Jan 27 2011, 17:10) *
Под эти требования подходит либо CPOL = 1, CPHA = 0, либо CPOL = 0, CPHA = 1. Но насколько я знаю режимы не взаимозаменяемы, то есть если одна из микросхем CPOL = 1, CPHA = 0, то и другая должна быть CPOL = 1, CPHA = 0.
А как из этого описания дальше понять какой из режимов применить?
Вам следует применить SPI Mode 2. См. таблицу Режимы SPI по ссылке.
Цитата(-=Женек=- @ Jan 27 2011, 17:10) *
Я правильно понял?
Примерно так.
Цитата(-=Женек=- @ Jan 27 2011, 17:10) *
На Fig6 и Fig7 одно и то же, а вот линии обозваны по разному - SO и SI. Там ошибка что ли?
Нет, в даташите не ошибка. На этих двух рисунках вовсе не одно и то же изображено. На одной диаграмме времянки для входного сигнала (SI), на второй - времянки для выходного сигнала (SO).
Go to the top of the page
 
+Quote Post
zheka
сообщение Jan 27 2011, 20:14
Сообщение #5


Гуру
******

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



Что-то не так....
Вот код:
Код
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1)|(1<<CPHA);//|(1<<CPOL)|(1<<CPHA);

.................


ubyte Send2SPI_TLE(ubyte data, unsigned char chip)
//Передает по SPI данные data и возвращает принятый байт
{
  
  SPDR = data;
  while(!(SPSR & (1<<SPIF)));
  return SPDR;


//****************
//Здесь требуется прописать обмен по SPI

}


ubyte SendWord2SPI_TLE(uword data)
//Отсылает двухбайтовое число по SPI младшим байтом вперед
//возвращает последний принятый байт

{
  uword dat;
  CS_2 = 0;
  Send2SPI_TLE(data,1);
  dat=Send2SPI_TLE(data>>8,1);
  CS_2=1;
  return dat;
}

.............

void main()
{
while(1)
{
TLE_WORD=SendWord2SPI_TLE(0b101000011111111);
}

}


А вот осциллограмма - красный график - MOSI, синий - CS_2.... такое ощущение, что программа не последовательно эти биты передает, а от середины до нулевого, затем от последнего до середины... Только что заметил - отсылает младшим байтом вперед, а мне нужно 16-тибитное число старшим. Как переделать функцию отправки слова?
То что на MISO творится, пока не поддается описанию...
Помогите разобраться...

Сообщение отредактировал zheka - Jan 27 2011, 20:20
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 27 2011, 20:33
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(zheka @ Jan 28 2011, 01:14) *
Только что заметил - отсылает младшим байтом вперед, а мне нужно 16-тибитное число старшим. Как переделать функцию отправки слова?

Дык, поменять местами data>>8 и data в SendWord2SPI_TLE(). Ну и комментарий, конечно sm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
zheka
сообщение Jan 27 2011, 20:58
Сообщение #7


Гуру
******

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



получилось, но на MISO что-то не то....
Go to the top of the page
 
+Quote Post
zheka
сообщение Jan 28 2011, 03:20
Сообщение #8


Гуру
******

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



Получилось! По крайней мере пару регистров прочел и записал. Спасибо за помощь.
Go to the top of the page
 
+Quote Post
zheka
сообщение Jan 28 2011, 15:48
Сообщение #9


Гуру
******

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



А для того чтобы изменить настройки SPI нужно его выключать?
Go to the top of the page
 
+Quote Post
zheka
сообщение Jan 28 2011, 19:33
Сообщение #10


Гуру
******

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



вытер сообщение...

Сообщение отредактировал zheka - Jan 28 2011, 19:56
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 28 2011, 20:10
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(zheka @ Jan 29 2011, 00:33) *
вытер сообщение...
Ну пока будет обдумывать, напомню еще раз, что SPI не просто принимает или передает данные, а осуществляет обмен данными. Для того, чтобы что-то прочитать по SPI, нужно что-то передать. После передачи первого (после активации CS) байта вы читаете из регистра SPI вовсе не ответ на эту первую команду, а просто какой-то мусор. Чтобы прочитать ответ на первую команду нужно передать еще один (второй) байт. Если в протоколе связи не предусмотрена какая-то функциональность для следующего байта, то передается dummy ("дурацкий", незначащий) -байт. И только после передачи второго байта, вы сможете прочитать из регистра SPI ответ на первый байт.
Go to the top of the page
 
+Quote Post
zheka
сообщение Jan 28 2011, 21:17
Сообщение #12


Гуру
******

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



rezident, спасибо. Уже дошел до этого сам. К необходимости передавать dummy тоже пришел, но мне казалось что это какое-то корявое решение, обусловленное моим незнанием. Спасибо, что очистили мне совесть )))

Go to the top of the page
 
+Quote Post
zheka
сообщение Jan 29 2011, 09:16
Сообщение #13


Гуру
******

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



Господа, курните пожалуйста прилагающийся в перво посте даташит и объясните мне, что такое DMOS? на стр.10 даташита он заявлен как Output state register, то есть вроде как должен использоваться для определения включен выход или выключен. ОДнако в нем всегда 0xFF. Я думал может неправильно играюсь с остальными регистрами - ан нет подпаял светодиодик - включаю его и выключаю без проблем.
Объясните мне что такое DMOS off и DMOS on и с чем его есть?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 2nd August 2025 - 05:33
Рейтинг@Mail.ru


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