|
|
  |
Помогите разобраться с микросхемой работающей по SPI |
|
|
|
Jan 25 2011, 15:11
|
Гуру
     
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jan 27 2011, 12:10
|
Знающий
   
Группа: Свой
Сообщений: 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. Там ошибка что ли?
|
|
|
|
|
Jan 27 2011, 12:44
|
Гуру
     
Группа: Свой
Сообщений: 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).
|
|
|
|
|
Jan 27 2011, 20:14
|
Гуру
     
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jan 28 2011, 20:10
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(zheka @ Jan 29 2011, 00:33)  вытер сообщение... Ну пока будет обдумывать, напомню еще раз, что SPI не просто принимает или передает данные, а осуществляет обмен данными. Для того, чтобы что-то прочитать по SPI, нужно что-то передать. После передачи первого (после активации CS) байта вы читаете из регистра SPI вовсе не ответ на эту первую команду, а просто какой-то мусор. Чтобы прочитать ответ на первую команду нужно передать еще один ( второй) байт. Если в протоколе связи не предусмотрена какая-то функциональность для следующего байта, то передается dummy ("дурацкий", незначащий) -байт. И только после передачи второго байта, вы сможете прочитать из регистра SPI ответ на первый байт.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|