Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите разобраться с микросхемой работающей по SPI
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
zheka
Господа, разбираюсь с микросхемой 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 МГц
XVR
Во первых - манипуляции с CS_1 перенесите из Send2SPI_TLE в SendWord2SPI_TLE (сейчас у вас SPI сбрасывается в середине между байтами, а не должен)
Проверьте настройку SPI - полярности клоков и места чтения (фиг 6 и 7 в DS на стр 12)

-=Женек=-
Вот выдержка из даташита:
Цитата
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. Там ошибка что ли?
rezident
Цитата(-=Женек=- @ 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).
zheka
Что-то не так....
Вот код:
Код
  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 творится, пока не поддается описанию...
Помогите разобраться...
AHTOXA
Цитата(zheka @ Jan 28 2011, 01:14) *
Только что заметил - отсылает младшим байтом вперед, а мне нужно 16-тибитное число старшим. Как переделать функцию отправки слова?

Дык, поменять местами data>>8 и data в SendWord2SPI_TLE(). Ну и комментарий, конечно sm.gif
zheka
получилось, но на MISO что-то не то....
zheka
Получилось! По крайней мере пару регистров прочел и записал. Спасибо за помощь.
zheka
А для того чтобы изменить настройки SPI нужно его выключать?
zheka
вытер сообщение...
rezident
Цитата(zheka @ Jan 29 2011, 00:33) *
вытер сообщение...
Ну пока будет обдумывать, напомню еще раз, что SPI не просто принимает или передает данные, а осуществляет обмен данными. Для того, чтобы что-то прочитать по SPI, нужно что-то передать. После передачи первого (после активации CS) байта вы читаете из регистра SPI вовсе не ответ на эту первую команду, а просто какой-то мусор. Чтобы прочитать ответ на первую команду нужно передать еще один (второй) байт. Если в протоколе связи не предусмотрена какая-то функциональность для следующего байта, то передается dummy ("дурацкий", незначащий) -байт. И только после передачи второго байта, вы сможете прочитать из регистра SPI ответ на первый байт.
zheka
rezident, спасибо. Уже дошел до этого сам. К необходимости передавать dummy тоже пришел, но мне казалось что это какое-то корявое решение, обусловленное моим незнанием. Спасибо, что очистили мне совесть )))

zheka
Господа, курните пожалуйста прилагающийся в перво посте даташит и объясните мне, что такое DMOS? на стр.10 даташита он заявлен как Output state register, то есть вроде как должен использоваться для определения включен выход или выключен. ОДнако в нем всегда 0xFF. Я думал может неправильно играюсь с остальными регистрами - ан нет подпаял светодиодик - включаю его и выключаю без проблем.
Объясните мне что такое DMOS off и DMOS on и с чем его есть?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.