|
Инициализация 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 | | |