Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Инициализация SPI модуля



Инициализация SPI модуля

Инициализация включает в себя конфигурирование выводов SPI модуля и управляющего регистра SPCR.

?

 

#define SPI_PORTX PORTB

#define SPI_DDRX DDRB

 

#define SPI_MISO 6

#define SPI_MOSI 5

#define SPI_SCK 7

#define SPI_SS 4

 

/*инициализация SPI модуля в режиме master*/

void SPI_Init(void)

{

/*настройка портов ввода-вывода

все выводы, кроме MISO выходы*/

SPI_DDRX = (1<<SPI_MOSI)|(1<<SPI_SCK)|(1<<SPI_SS)|(0<<SPI_MISO);

SPI_PORTX = (1<<SPI_MOSI)|(1<<SPI_SCK)|(1<<SPI_SS)|(1<<SPI_MISO);

 

/*разрешение spi,старший бит вперед,мастер, режим 0*/

SPCR = (1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)|(1<<SPR1)|(0<<SPR0);

SPSR = (0<<SPI2X);

}

 

Передача/прием данных

Процесс передачи/приема данных с помощью SPI модуля, работающего в режиме Master, состоит из следующей последовательности действий:

1. установка низкого логического уровня на линии SS
2. загрузка данных в регистр SPDR
3. ожидание окончания передачи (проверка флага SPIF)
4. сохранение принятых данных (чтение SPDR), если требуется
5. возврат на 2-ой шаг, если переданы не все данные
6. установка высокого логического уровня на линии SS

Ниже приведено несколько вариантов функции передачи/приема данных.

Передача одного байта данных по SPI

?

 

void SPI_WriteByte(unsigned char data)

{

SPI_PORTX &= ~(1<<SPI_SS);

SPDR = data;

while(!(SPSR & (1<<SPIF)));

SPI_PORTX |= (1<<SPI_SS);

}

 

Передача и прием одного байта данных по SPI

 

?

 

unsigned char SPI_ReadByte(unsigned char data)

{

unsigned char report;

SPI_PORTX &= ~(1<<SPI_SS);

SPDR = data;

while(!(SPSR & (1<<SPIF)));

report = SPDR;

SPI_PORTX |= (1<<SPI_SS);

return report;

}

 

Передача нескольких байтов данных по SPI
*data – указатель на массив передаваемых данных, а num – размерность массива

 

?

 

void SPI_WriteArray(unsigned char num, unsigned char *data)

{

SPI_PORTX &= ~(1<<SPI_SS);

while(num--){

SPDR = *data++;

while(!(SPSR & (1<<SPIF)));

}

SPI_PORTX |= (1<<SPI_SS);

}

 

...

 

//Пример использования:

unsigned char buf[3] = {12, 43, 98};

 

SPI_WriteArray(3, buf);


Передачи и прием нескольких байтов данных по SPI
*data – указатель на массив передаваемых данных, а num – размерность массива.
Принятые данные будут сохраняться в том же массиве.

 

?

 

void SPI_ReadArray(unsigned char num, unsigned char *data)

{

SPI_PORTX &= ~(1<<SPI_SS);

while(num--){

SPDR = *data;

while(!(SPSR & (1<<SPIF)));

*data++ = SPDR;

}

SPI_PORTX |= (1<<SPI_SS);

}

UART

 

1. void USART_Init(unsigned int baudrate) //Функция инициализации USART

2. {

3. UBRRH = (unsigned char) (baudrate>>8);

4. UBRRL = (unsigned char) baudrate;

5. UCSRA = (1<<U2X); //Удвоение скорости

6. UCSRB = ((1 << RXEN) | (1 << TXEN)); //Разрешение на прием и н апередачу через USART

7. UCSRC = (1<<USBS) | (3<<UCSZ0);



8. }

9.

10.

11. unsigned char USART_Receive(void) //Функция приема данных

12. {

13. while (!(UCSRA & (1<<RXC))); //Ожидание приема символа

14. return UDR; //Возврат символа

15. }

16.

17. void USART_Transmit(unsigned char data) //Функция отправки данных

18. {

19. while (!(UCSRA & (1<<UDRE))); //Ожидание опустошения буфера приема

20. UDR = data; //Начало передачи данных

21. }

TWI

Вся работа TWI сводится к алгоритму:

1. Записать значение в регистр TWCR (а при передачи данных предварительно поместить байтик в TWDR)

2. Дождаться флага TWINT в том же регистре TWCR (при работе с прерываниями — этот флаг вызовет прерывание по-вектору TWI)

3. Получить статус из регистра TWSR — в зависимости от статуса, что-то делать или не делать дальше.

1234567891011121314151617181920212223242526272829 #define TWI_START 0#define TWI_RESTART 1#define TWI_STOP 2#define TWI_TRANSMIT 3#define TWI_RECEIVE_ACK 4#define TWI_RECEIVE_NACK 5 uint8_t twi(uint8_t action){ switch(action){ case TWI_START: case TWI_RESTART: TWCR = _BV(TWSTA) | _BV(TWEN) | _BV(TWINT) | _BV(TWIE); break; case TWI_STOP: TWCR = _BV(TWSTO) | _BV(TWEN) | _BV(TWINT) | _BV(TWIE); break; case TWI_TRANSMIT: TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWIE); break; case TWI_RECEIVE_ACK: TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWEA)| _BV(TWIE); break; case TWI_RECEIVE_NACK: TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWIE); break; } if(action!= TWI_STOP)while (!(TWCR & _BV(TWINT))); return (TWSR & 0xF8);}

Пример чтения (без всяких проверок и контроля выполнения) 128 байтов из EEPROM 24C01S:


Дата добавления: 2015-09-29; просмотров: 31 | Нарушение авторских прав




<== предыдущая лекция | следующая лекция ==>
Http://meandr. Org/archives/5171 | 

mybiblioteka.su - 2015-2024 год. (0.009 сек.)