Я пользуюсь atmega16u2 для разговора с SI4432. Как видите mode 0 и все прекрасно работает.
Код такой:
void SPI_MasterInit(void) {
UBRR1 = 0; /* Set MOSI and SCK output, all others input */ DDRB = (1<<MOSI)|(1<<SCK)|(1<<SS); PORTB |= (1<<SS);
/* Enable SPI, Master, set clock rate fck/16 */ SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); /* Set MSPI mode of operation and SPI data mode 0. */ //UCSR1C = (1<<UMSEL11)|(1<<UMSEL10)|(0<<UCPOL1); /* Enable receiver and transmitter. */ //UCSR1B = (1<<RXEN1)|(1<<TXEN1); //UBRR1 = 3; // rate }
uint8_t SPI_MasterTransmit(uint8_t cData) { /* Wait for empty transmit buffer */ //while( !( UCSR1A & (1<<UDRE1)) ); /* Start transmission */ SPDR = cData; while( !(SPSR & (1<<SPIF)) ); /* Get and return received data from buffer */ return SPDR; }
uint8_t WriteReg(uint8_t reg_addr, uint8_t reg_val){ uint8_t r;
PORTB &=0xFE; // SPI CS low r = SPI_MasterTransmit(reg_addr); r = SPI_MasterTransmit(reg_val); PORTB |= 1; // SPI CS high return r; }
uint8_t ReadReg(uint8_t reg_addr){
uint8_t r;
PORTB &=0xFE; // SPI CS low SPI_MasterTransmit(reg_addr); r = SPI_MasterTransmit(0xff); PORTB |= 1; // SPI CS high return r;
}
void BurstWrite(uint8_t *DataArray){ uint8_t i; uint8_t n; n = ser_packet_len - 2; // minus type and addr PORTB &=0xFE; // SPI CS low SPI_MasterTransmit(DataArray[1]);//start address for(i=0; i<n; i++) SPI_MasterTransmit(DataArray[2+i]); PORTB |= 1; // SPI CS high }
void BurstRead(uint8_t start_addr, uint8_t n){ uint8_t i; if(n > 64) return; PORTB &=0xFE; // SPI CS low SPI_MasterTransmit(start_addr); //start address for(i=0; i<n; i++) OutputData[i] = SPI_MasterTransmit(0xff); PORTB |= 1; // SPI CS high }
|