Полная версия этой страницы:
Настройка SI4432
antonioPROX
Nov 3 2013, 10:41
Уважаемые знатоки, начинаю работать с SI4432 собрал схему в соответствии с AN415 (FIFO) подключил к Atmega8535 по SPI.
Проблема в том что не чего не могу читать не какой регистр сплошные 00000… и FFF ….
Одного не могу понять у Atmega8535 3 режима SPI какой надо вставить для того что бы он работал с SI4432.
При подаче питание на SI4432 на GPIO генерируется 32 кГц.
Я всегда начинаю с софтового spi и вам советую, там 5 строк кода. Иногда и на хардовый не перехожу, если скорость позволяет — лень читать все эти регистры настроек в даташите.
Я пользуюсь 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
}
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.