Вт дек 05, 2017 17:37:10
void AD7091_Init_GPIO()
{
GPIO_InitTypeDef gpio_def;
SPI_InitTypeDef spi_def;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_5);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_5);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_5);
// GPIO для SPI1
gpio_def.GPIO_Mode = GPIO_Mode_AF;
gpio_def.GPIO_OType = GPIO_OType_PP;
gpio_def.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
gpio_def.GPIO_PuPd = GPIO_PuPd_NOPULL;
gpio_def.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpio_def);
// GPIO для CS - ручное управление
gpio_def.GPIO_Mode = GPIO_Mode_OUT;
gpio_def.GPIO_OType = GPIO_OType_PP;
gpio_def.GPIO_Pin = GPIO_Pin_4;
gpio_def.GPIO_PuPd = GPIO_PuPd_UP;
gpio_def.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpio_def);
// GPIO для CONVST
gpio_def.GPIO_Mode = GPIO_Mode_OUT;
gpio_def.GPIO_OType = GPIO_OType_PP;
gpio_def.GPIO_Pin = GPIO_Pin_14;
gpio_def.GPIO_PuPd = GPIO_PuPd_DOWN;
gpio_def.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &gpio_def);
GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
GPIO_WriteBit(GPIOD, GPIO_Pin_14, Bit_SET);
spi_def.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
spi_def.SPI_Mode = SPI_Mode_Master;
spi_def.SPI_DataSize = SPI_DataSize_16b;
spi_def.SPI_CPOL = SPI_CPOL_High;
spi_def.SPI_CPHA = SPI_CPHA_2Edge;
spi_def.SPI_NSS = SPI_NSS_Soft;
spi_def.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;
spi_def.SPI_FirstBit = SPI_FirstBit_MSB;
spi_def.SPI_CRCPolynomial = 0x7;
SPI_Init(SPI1, &spi_def);
SPI_Cmd(SPI1, ENABLE);
}
#define AD7091_CONFIG 0x14C0
#define CH0_LO 0x2400
#define CH0_HI 0x2DFF
#define CH0_HY 0x35FF
#define CH1_LO 0x3C00
#define CH1_HI 0x45FF
#define CH1_HY 0x4DFF
#define CONVERT_OFF 0x0000
#define CONVERT_ON 0x0001
uint16_t AD7091_WtiteData(int convert, uint16_t data)
{
uint16_t result = 0x0;
if(convert == CONVERT_ON)
{
GPIO_WriteBit(GPIOD, GPIO_Pin_14, Bit_RESET);
GPIO_WriteBit(GPIOD, GPIO_Pin_14, Bit_SET);
}
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
SPI_I2S_SendData16(SPI1, data);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
result = SPI_I2S_ReceiveData16(SPI1);
GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
return result;
}
uint16_t AD7091_ReadData(uint16_t data)
{
uint16_t result = 0x0;
AD7091_WtiteData(CONVERT_OFF, data);
result = AD7091_WtiteData(CONVERT_OFF, 0x00);
return result;
}
void AD7091_Init()
{
uint16_t result = 0x00;
AD7091_Init_GPIO();
for(int i = 0; i < 0x42; i++)
{
GPIO_WriteBit(GPIOD, GPIO_Pin_14, Bit_RESET);
GPIO_WriteBit(GPIOD, GPIO_Pin_14, Bit_SET);
}
AD7091_WtiteData(CONVERT_OFF, AD7091_CONFIG);
AD7091_WtiteData(CONVERT_OFF, CH0_LO);
AD7091_WtiteData(CONVERT_OFF, CH0_HI);
AD7091_WtiteData(CONVERT_OFF, CH0_HY);
AD7091_WtiteData(CONVERT_OFF, CH1_LO);
AD7091_WtiteData(CONVERT_OFF, CH1_HI);
AD7091_WtiteData(CONVERT_OFF, CH1_HY);
result = AD7091_ReadData(0x800);
result = AD7091_ReadData(0x1000);
result = AD7091_ReadData(0x2000);
result = AD7091_ReadData(0x2800);
result = AD7091_ReadData(0x3000);
result = AD7091_ReadData(0x3800);
result = AD7091_ReadData(0x4000);
result = AD7091_ReadData(0x4800);
}
uint16_t AD7091_GetData()
{
uint16_t adc[4];
uint16_t result = 0x00;
adc[0] = AD7091_WtiteData(CONVERT_ON, 0x00);
return result;
}
uint16_t AD7091_GetData()
{
uint16_t adc[4];
uint16_t result = 0x00;
adc[0] = AD7091_WtiteData(CONVERT_ON, 0xC01);
adc[1] = AD7091_WtiteData(CONVERT_ON, 0xC02);
adc[2] = AD7091_WtiteData(CONVERT_ON, 0x000);
adc[3] = AD7091_WtiteData(CONVERT_ON, 0x000);
return result;
}
Чт дек 07, 2017 12:59:52
#define AD7091_CONFIG 0x14C0
Чт дек 07, 2017 22:59:04
Бубоник писал(а):Откуда взяли значение 0x14C0?
- Код:
#define AD7091_CONFIG 0x14C0
Пт дек 08, 2017 14:23:00
Пт дек 08, 2017 16:36:31
Бубоник писал(а):А где у вас записываются данные в конфигурационный регистр?
void AD7091_Init()
{
uint16_t result = 0x00;
AD7091_Init_GPIO();
for(int i = 0; i < 0x42; i++)
{
GPIO_WriteBit(GPIOD, GPIO_Pin_14, Bit_RESET);
GPIO_WriteBit(GPIOD, GPIO_Pin_14, Bit_SET);
}
AD7091_WtiteData(CONVERT_OFF, AD7091_CONFIG);
AD7091_WtiteData(CONVERT_OFF, CH0_LO);
AD7091_WtiteData(CONVERT_OFF, CH0_HI);
AD7091_WtiteData(CONVERT_OFF, CH0_HY);
AD7091_WtiteData(CONVERT_OFF, CH1_LO);
AD7091_WtiteData(CONVERT_OFF, CH1_HI);
AD7091_WtiteData(CONVERT_OFF, CH1_HY);
result = AD7091_ReadData(0x800);
result = AD7091_ReadData(0x1000);
result = AD7091_ReadData(0x2000);
result = AD7091_ReadData(0x2800);
result = AD7091_ReadData(0x3000);
result = AD7091_ReadData(0x3800);
result = AD7091_ReadData(0x4000);
result = AD7091_ReadData(0x4800);
}
Пт дек 08, 2017 19:21:19
AD7091_WtiteData(CONVERT_OFF, AD7091_CONFIG);
result = AD7091_ReadData(0x800);
Вс дек 10, 2017 06:59:58
Вс дек 10, 2017 19:59:35
Вс дек 10, 2017 20:21:35
Вт дек 12, 2017 17:34:44
Бубоник писал(а):А какие он данные присылает после команды 0x800?
//Channel
result = AD7091_ReadData(0x800); //0
//Configuration
result = AD7091_ReadData(0x1000); //192
//Channel 0 low limit
result = AD7091_ReadData(0x2000); //0
//Channel 0 high limit
result = AD7091_ReadData(0x2800); //4095
//Channel 0 hysteresis
result = AD7091_ReadData(0x3000); //511
//Channel 1 low limit
result = AD7091_ReadData(0x3800); //0
//Channel 1 high limit
result = AD7091_ReadData(0x4000); //4095
//Channel 1 hysteresis
result = AD7091_ReadData(0x4800); //511
//----------
//Configuration
AD7091_WtiteData(CONVERT_ON, 0x16C0);
//Channel 0 low limit
AD7091_WtiteData(CONVERT_ON, 0x2400);
//Channel 0 high limit
AD7091_WtiteData(CONVERT_ON, 0x2DFF);
//Channel 0 hysteresis
AD7091_WtiteData(CONVERT_ON, 0x35FF);
//Channel 1 low limit
AD7091_WtiteData(CONVERT_ON, 0x3C00);
//Channel 1 high limit
AD7091_WtiteData(CONVERT_ON, 0x45FF);
//Channel 1 hysteresis
AD7091_WtiteData(CONVERT_ON, 0x4DFF);
//----------
//Channel
result = AD7091_ReadData(0x800); //0
//Configuration
result = AD7091_ReadData(0x1000); //192
//Channel 0 low limit
result = AD7091_ReadData(0x2000); //0
//Channel 0 high limit
result = AD7091_ReadData(0x2800); //4095
//Channel 0 hysteresis
result = AD7091_ReadData(0x3000); //511
//Channel 1 low limit
result = AD7091_ReadData(0x3800); //0
//Channel 1 high limit
result = AD7091_ReadData(0x4000); //4095
//Channel 1 hysteresis
result = AD7091_ReadData(0x4800); //511
//----------
Вт дек 12, 2017 22:37:16
Если я правильно понял документацию флаг soft reset сбрасывается автоматически, вот он и возвращает значение 192. Пробуйте считывать данные, посмотрите что он будет выдавать.Если я в Configuration записываю значение 0x16C0, то он в ответ на чтение присылает 192
Чт дек 14, 2017 23:49:05
Бубоник писал(а):Пробуйте считывать данные, посмотрите что он будет выдавать.
Пт дек 15, 2017 17:06:51
Пт дек 15, 2017 18:42:07
Бубоник писал(а):Че то он многовато присылает 8192. Spi протокол точно правильно работает?
Сб дек 16, 2017 16:49:14
Вс дек 17, 2017 22:58:07
Бубоник писал(а):Исходник можно в студию?
#define AD7091_CONFIG 0x1600
#define CH0_LO 0x2400
#define CH0_HI 0x2DFF
#define CH0_HY 0x35FF
#define CH1_LO 0x3C00
#define CH1_HI 0x45FF
#define CH1_HY 0x4DFF
#define CONVERT_OFF 0x0000
#define CONVERT_ON 0x0001
uint16_t AD7091_WtiteData(int convert, uint16_t data)
{
uint16_t result = 0x0;
if(convert == CONVERT_ON)
{
GPIO_WriteBit(GPIOD, GPIO_Pin_14, Bit_RESET);
GPIO_WriteBit(GPIOD, GPIO_Pin_14, Bit_SET);
}
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
SPI_I2S_SendData16(SPI1, data);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
result = SPI_I2S_ReceiveData16(SPI1);
GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
return result;
}
uint16_t AD7091_ReadData(uint16_t data)
{
uint16_t result = 0x0;
AD7091_WtiteData(CONVERT_ON, data);
result = AD7091_WtiteData(CONVERT_OFF, 0x00);
return result;
}
void AD7091_Init()
{
uint16_t result = 0x00;
AD7091_Init_GPIO();
for(int i = 0; i < 0x42; i++)
{
GPIO_WriteBit(GPIOD, GPIO_Pin_14, Bit_RESET);
GPIO_WriteBit(GPIOD, GPIO_Pin_14, Bit_SET);
}
AD7091_WtiteData(CONVERT_ON, AD7091_CONFIG);
AD7091_WtiteData(CONVERT_ON, CH0_LO);
AD7091_WtiteData(CONVERT_ON, CH0_HI);
AD7091_WtiteData(CONVERT_ON, CH0_HY);
AD7091_WtiteData(CONVERT_ON, CH1_LO);
AD7091_WtiteData(CONVERT_ON, CH1_HI);
AD7091_WtiteData(CONVERT_ON, CH1_HY);
result = AD7091_ReadData(0x800);
result = AD7091_ReadData(0x1000);
result = AD7091_ReadData(0x2000);
result = AD7091_ReadData(0x2800);
result = AD7091_ReadData(0x3000);
result = AD7091_ReadData(0x3800);
result = AD7091_ReadData(0x4000);
result = AD7091_ReadData(0x4800);
}
uint16_t AD7091_GetData()
{
uint16_t adc[4] = {0};
uint16_t result = 0x00, chn = 0x00;
adc[0] = AD7091_WtiteData(CONVERT_ON, 0xC01);
adc[1] = AD7091_WtiteData(CONVERT_ON, 0xC02);
adc[2] = AD7091_WtiteData(CONVERT_ON, 0x000);
adc[3] = AD7091_WtiteData(CONVERT_ON, 0x000);
chn = adc[0] >> 13;
result = adc[0] & 0xFFF;
return result;
}
Чт дек 21, 2017 09:54:56
Чт дек 21, 2017 16:19:49
Бубоник писал(а):Почему у вас на запись данных аналоговые входа включены а на чтение данных выключены?
Чт дек 21, 2017 17:44:13
adc[0] = AD7091_WtiteData(CONVERT_ON, 0xC01);
adc[1] = AD7091_WtiteData(CONVERT_ON, 0xC02);
result = AD7091_ReadData(0x800);
result = AD7091_ReadData(0x1000);
Чт дек 21, 2017 18:58:25
Бубоник писал(а):Вот здесь вы записываете данные в регистр аналоговых входов и тем самым включаете их.
- Код:
adc[0] = AD7091_WtiteData(CONVERT_ON, 0xC01);
adc[1] = AD7091_WtiteData(CONVERT_ON, 0xC02);А здесь вы пытаетесь считать данные с аналоговых входов, но они выключены.
- Код:
result = AD7091_ReadData(0x800);
result = AD7091_ReadData(0x1000);