19.04.2013, 09:58
|
|
Прописка
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
STM32 Не получается настроить термометр ds1621
Здравствуйте,
На МК STM32 Не получается настроить термометр ds1621. Дисплей показывает 0.00. Подскажите, что не так:
Код:
|
void delay(int time) {
volatile uint32_t tmpvar;
for (tmpvar=24000*time;tmpvar!=0;tmpvar--);
}
int main(void){
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_8 | GPIO_Pin_9);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=(GPIO_Pin_4 | GPIO_Pin_6 );
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=(GPIO_Pin_5 | GPIO_Pin_7 );
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING ;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//Заполняем структуру с параметрами SPI модуля
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lin es_FullDuplex;//полный дуплекс
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;// передаем по 8 бит
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;// Полярность и
SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;// фаза тактового сигнала
SPI_InitStructure.SPI_NSS=SPI_NSS_Hard;// Управлять состоянием сигнала NSS аппаратно
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRa tePrescaler_32;// Предделитель SCK
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;// Первым отправляется старший бит
SPI_InitStructure.SPI_Mode=SPI_Mode_Master; //Режим - мастер
SPI_Init(SPI1,&SPI_InitStructure); ///Настраиваем SPI1
SPI_I2S_ITConfig(SPI1,SPI_I2S_IT_RXNE | SPI_I2S_IT_TXE,ENABLE); //Включаем прерывание по приему байта
SPI_Cmd(SPI1,ENABLE); // Включаем модуль SPI1....
SPI_I2S_SendData(SPI1, 0xA8); //инициализация термометра
delay(5); //задержка 5мс
SPI_I2S_SendData(SPI1, 0xEE); //старт преобразований термометра
delay(5); //задержка 5мс
float temperature;
lcd_init(); //Инициализируем дисплей
char buf[18]; // все равно максимальная точность на Intel платформе 17 знаков
lcd_set_state(LCD_ENABLE, CURSOR_ENABLE, BLINK); //Включаем курсор и мигалку
float h;
int fDisplay=1;
while (1) {
fDisplay++;
if (fDisplay › 100000) {
SPI_I2S_SendData(SPI1, 0x90); ////Адрес микросхемы
SPI_I2S_SendData(SPI1, 0xAA); //команда - прочитать температуру
temperature=SPI_I2S_ReceiveData (SPI1);
//temperature=temperature*0x0100 + SPI_I2S_ReceiveData (SPI1); //2 байта
h =(float) temperature;
fDisplay = 0;
sprintf(buf,"temper %5.2f", h);
lcd_set_xy(0, 0);
lcd_out(buf);
}
} |
|
|
|
|
19.04.2013, 10:06
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: STM32 Не получается настроить термометр ds1621
Могу только помочь настройками SPI.
Код:
|
void init_GPIO(SPI_TypeDef* SPIx)
{
GPIO_InitTypeDef GPIO_InitStruct;
if (SPIx==SPI1)
{
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPI O_Pin_7; //alternative func for SPI
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
if (SPIx==SPI2)
{
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|G PIO_Pin_15; //alternative func for SPI
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
}
} |
Код:
|
void init_SPI (SPI_TypeDef* SPIx)
{
SPI_InitTypeDef SPI_InitStruct;
SPI_InitStruct.SPI_Direction=SPI_Direction_2Lines_ FullDuplex;
SPI_InitStruct.SPI_Mode=SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize=SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL=SPI_CPOL_Low;
SPI_InitStruct.SPI_CPHA=SPI_CPHA_1Edge;
SPI_InitStruct.SPI_NSS=SPI_NSS_Soft;
SPI_InitStruct.SPI_BaudRatePrescaler=SPI_BaudRateP rescaler_2;
SPI_InitStruct.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_InitStruct.SPI_CRCPolynomial=7;
SPI_Init(SPIx, &SPI_InitStruct);
SPI_Cmd(SPIx, ENABLE);
} |
Код:
|
void SPI_SendByte(SPI_TypeDef* SPIx,u8 byte)
{
u8 tmp=SPI_ReadByte(SPIx,byte);
}
u8 SPI_ReadByte(SPI_TypeDef* SPIx,u8 byte)
{
#ifdef test_spi
test_var=byte;
#endif
/* Loop while DR register in not emplty */
while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
/* Send byte through the SPI1 peripheral */
SPI_I2S_SendData(SPIx, byte);
/* Wait to receive a byte */
while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
/* Return the byte read from the SPI bus */
return SPI_I2S_ReceiveData(SPIx);
} |
|
|
|
|
19.04.2013, 13:05
|
|
Вид на жительство
Регистрация: 03.06.2007
Сообщений: 368
Сказал спасибо: 3
Сказали Спасибо 59 раз(а) в 52 сообщении(ях)
|
Re: STM32 Не получается настроить термометр ds1621
Прошу извинить,а что у STM32 SPI и I2C одно и тоже?
|
|
|
|
19.04.2013, 15:21
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: STM32 Не получается настроить термометр ds1621
А где вы увидели I2C?
en.wikipedia.org/wiki/I²S
|
|
|
|
19.04.2013, 15:29
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: STM32 Не получается настроить термометр ds1621
У ds1621 интерфейс I2C
|
|
|
Сказали "Спасибо" Yurkin2007
|
|
|
19.04.2013, 15:32
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: STM32 Не получается настроить термометр ds1621
А зачем он тогда SPI инитиализирует?
|
|
|
|
19.04.2013, 15:43
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: STM32 Не получается настроить термометр ds1621
ну, промахнулся чуток ...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:35.
|
|