Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.74.54] |
|
Сообщ.
#1
,
|
|
|
Доброго всем дня!
У меня возникла следующая проблема: пытаюсь передавать данные через SPI, но ничего не получается...Через вывод PB7 синхросигнал выходит, а данные никак не хотят... Вот примерный код программки (AVR Studio): #include <avr/io.h> #include <util/delay.h> int main(void) { DDRB = 0xff; PORTB = 0b11000000; USIDR = 0b10101011; //USI Control Register - USICR //Bit 7 - USISIE - Start Condition Interrupt Enable //Bit 6 - USIOIE - Counter Overflow Interrupt Enable //Bit 5-4 - USIWM1:0 - Wire Mode //Bit 3-2 - USICS1:0 - Clock Source Select //Bit 1 - USICLK - Clock Strobe //Bit 0 - USITC - Toggle Clock Port Pin USICR=0b00100010; //USI Status Register - USISR //Bit 7 - USISIF - Start Condition Interrupt Flag //Bit 6 - USIOIF - Counter Overflow Interrupt Flag //Bit 5 - USIPF - Stop Condition Flag //Bit 4 - USIDC - Data Output Condition //Bit 3-0 - USICNT3:0 - Counter Value USISR = 0b00000001; for (int i = 0; i<16; i++) { _delay_ms(50); //задержка для наглядности процесса))) USICR |= (1<<USITC); } while(1) { } } Может я в программе что-то напудрил...Просто для 2313 по SPI в инете пока ничего нормального не нашел...Читал даташит, там вроде все написано, но я чесно говоря на английском не очень понял все нюансы... Заранее благодарен за помощь! |
Сообщ.
#2
,
|
|
|
appshneg, попробуй пример из даташита.
Там на ассемблере, но если писать на С получится приблизительно так: USIDR = 0xAB; USISR = USIOIF; for(;;) { USICR = USIWM0 | USICLK | USITC; if((USISR & USIOIF)==0) { // вероятно, зачистка USIDR; break; } } На сколько это близко к ассемблерному примеру можно понять, сгенерировав ассемблерный листинг твоей С-шной программы. Кроме того, этот исходник на С зависит от определений бит. В моём случае это: /* UART I/O Data Register */ sfrb UDR = 0x0C; sfrb USICR = 0x0D; #define USISIE (1<<7) #define USIOIE (1<<6) #define USIWM1 (1<<5) #define USIWM0 (1<<4) #define USICS1 (1<<3) #define USICS0 (1<<2) #define USICLK (1<<1) #define USITC (1<<0) sfrb USISR = 0x0E; #define USISIF (1<<7) #define USIOIF (1<<6) #define USIPF (1<<5) #define USIDC (1<<4) #define USICNT3 (1<<3) #define USICNT2 (1<<2) #define USICNT1 (1<<1) #define USICNT0 (1<<0) sfrb USIDR = 0x0F; |
Сообщ.
#3
,
|
|
|
ЫукпШ, спасибо за ответ:)
Я еще хотел спросить: PB5 - in, PB6 - out, PB7 - out верно??? |
Сообщ.
#4
,
|
|
|
Цитата appshneg @ Я еще хотел спросить: PB5 - in, PB6 - out, PB7 - out верно??? DDRB = 0xff; я думаю нет. DDRB определяет направление передачи порта. 0 - (после сброса) in 1 - out DDRB = 0xFF - все биты порта В на вывод. |
Сообщ.
#5
,
|
|
|
Все, вопрос решился Помог все-таки даташит
Вот что у меня получилось: unsigned char ch16 = 0b00000000; unsigned char ch17 = 0b00000000; int main(void) { ch16 = (1<<USIWM0)|(0<<USICS0)|(1<<USITC); ch17 = (1<<USIWM0)|(0<<USICS0)|(1<<USITC)|(1<<USICLK); ... while(1); } void SendSPIByte(unsigned char byte) { //USI Control Register - USICR //Bit 7 - USISIE - Start Condition Interrupt Enable //Bit 6 - USIOIE - Counter Overflow Interrupt Enable //Bit 5-4 - USIWM1:0 - Wire Mode //Bit 3-2 - USICS1:0 - Clock Source Select //Bit 1 - USICLK - Clock Strobe //Bit 0 - USITC - Toggle Clock Port Pin USICR=0b00010010; //USI Status Register - USISR //Bit 7 - USISIF - Start Condition Interrupt Flag //Bit 6 - USIOIF - Counter Overflow Interrupt Flag //Bit 5 - USIPF - Stop Condition Flag //Bit 4 - USIDC - Data Output Condition //Bit 3-0 - USICNT3:0 - Counter Value USISR = 0b00000000; USIDR = byte; for (int i = 0; i<16; i++) USICR = (i%2 == 0) ? ch16 : ch17; } |