Господа, разбираюсь с микросхемой 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