如何使用spi通信将STM32F302R8与ADS1256连接?

如何使用spi通信将STM32F302R8与ADS1256连接?,stm32,spi,stm32f4discovery,nucleo,interfacing,Stm32,Spi,Stm32f4discovery,Nucleo,Interfacing,我曾尝试使用SPI通信连接Nucleo-F302R8和高精度AD/DA波共享板。这样做时,我无法发送或接收数据。我使用spi3进行通信,并为芯片选择引脚提供I/o。spi_clk引脚未产生任何时钟脉冲。我试着通过环回调试spi,发现mosi引脚正在接收信号,但时钟还是空的(用数字示波器检查)。我对这个环境是新手,需要很大的帮助。我在下面分享了我的代码片段。 Spi配置:2线,8位,极性低,相位1边缘,msb优先 void adc_write(uint8_t address, uint8_t va

我曾尝试使用SPI通信连接Nucleo-F302R8和高精度AD/DA波共享板。这样做时,我无法发送或接收数据。我使用spi3进行通信,并为芯片选择引脚提供I/o。spi_clk引脚未产生任何时钟脉冲。我试着通过环回调试spi,发现mosi引脚正在接收信号,但时钟还是空的(用数字示波器检查)。我对这个环境是新手,需要很大的帮助。我在下面分享了我的代码片段。 Spi配置:2线,8位,极性低,相位1边缘,msb优先

void adc_write(uint8_t address, uint8_t value)
{
uint8_t data[3];
data[0] = 0x50|address;
data[1] = 0x01;
data[2] = value;
HAL_GPIO_WritePin(GPIOC, CHIP_SELECT_Pin, GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi3, data,receive, 3, 50);
//DWT_Delay(10);
HAL_GPIO_WritePin(GPIOC, CHIP_SELECT_Pin, GPIO_PIN_SET);
}

void adc_write_command(uint8_t command)
{
HAL_GPIO_WritePin(GPIOC, CHIP_SELECT_Pin, GPIO_PIN_RESET);
  HAL_SPI_TransmitReceive(&hspi3,&command,receive,1,50);
  //DWT_Delay(10);
HAL_GPIO_WritePin(GPIOC, CHIP_SELECT_Pin, GPIO_PIN_SET);

}

int adc_read()
{
uint8_t datacon;
uint32_t convert = 0x00;
HAL_GPIO_WritePin(GPIOC, CHIP_SELECT_Pin, GPIO_PIN_RESET);
adc_write_command(0x01); //read

for(int i=0;i<3;i++)
{
HAL_SPI_TransmitReceive(&hspi3,0x00,&datacon,1,50);
convert |= datacon;
convert<<=8;
}

//DWT_Delay(10);
HAL_GPIO_WritePin(GPIOC, CHIP_SELECT_Pin, GPIO_PIN_SET);
return convert;
}

float volt(uint32_t data2)
{
float v;
 v =(float) data2*0.000000596046; // 8388607 = +5.000v reference voltage
return v;
}


void adc_read_regis(uint8_t address1)
{
uint8_t data1[3];
data1[0] = 0x50|address1;
data1[1] = 0x01;
HAL_GPIO_WritePin(GPIOC, CHIP_SELECT_Pin, GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi3, data1,receive, 2, 50);
HAL_SPI_TransmitReceive(&hspi3,0x00, &data1[2],1,50);
//DWT_Delay(10);
HAL_GPIO_WritePin(GPIOC, CHIP_SELECT_Pin, GPIO_PIN_SET);
}

void adc_reset()
{
HAL_GPIO_WritePin(GPIOC, CHIP_SELECT_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, RESET_Pin, GPIO_PIN_RESET);
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOC, RESET_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, CHIP_SELECT_Pin, GPIO_PIN_SET);
}

void adc_init()
{
adc_write(0x00, 0x03); //status
adc_write(0x02, 0x20); //adcon
adc_write(0x03, 0x82); //drate 100sps
adc_read_regis(0x00); //verification
adc_write_command(0xF0); //selfcab of adc
adc_write(0x01, 0x0F); //mux for channel 0 positive
adc_write_command(0xFC); //sync
adc_write_command(0x00); //wake up
HAL_Delay(500);

}

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */

uint32_t adc_data_ch0, adc_data_ch1;
float voltage_ch0, voltage_ch1;

/* USER CODE END 1 */


/* MCU Configuration--------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();

/* USER CODE BEGIN Init */

/* USER CODE END Init */

/* Configure the system clock */
SystemClock_Config();

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_SPI3_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
 MX_GPIO_Init();
 HAL_GPIO_WritePin(GPIOC, CHIP_SELECT_Pin, GPIO_PIN_RESET);
 adc_reset();
 HAL_Delay(500);
 MX_SPI3_Init();
 HAL_Delay(500);
 adc_write_command(0xFE); //reset to power up values
 adc_write_command(0xFC); //sync
 adc_write_command(0x00); //wake up
 //DWT_Delay(10);
 adc_init();
 HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET); //confirm configuration
 MX_USART2_UART_Init();

/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
 HAL_GPIO_WritePin(GPIOC, CHIP_SELECT_Pin, GPIO_PIN_RESET);
 while(HAL_GPIO_ReadPin(DRDY_GPIO_Port,DRDY_Pin));
 adc_write(0x01, 0x1F); //mux for ch1 positive channel
 adc_write_command(0xFC); //sync
 adc_write_command(0x00); //wake up
 adc_data_ch0 = adc_read();
 voltage_ch0 = volt(adc_data_ch0);
 HAL_Delay(100);
 while(HAL_GPIO_ReadPin(DRDY_GPIO_Port,DRDY_Pin));
 adc_write(0x01, 0x0F); //mux for ch0 positive channel
 adc_write_command(0xFC); //sync
 adc_write_command(0x00); //wake up
 adc_data_ch1 = adc_read();
 voltage_ch1 = volt(adc_data_ch1);
 //frequency_in_ch1 = freq(voltage_in_ch1);

 HAL_Delay(100);

 HAL_GPIO_WritePin(GPIOC, CHIP_SELECT_Pin, GPIO_PIN_SET);

}
 /* USER CODE END WHILE */

 /* USER CODE BEGIN 3 */

/* USER CODE END 3 */
}
void adc_write(uint8_t地址,uint8_t值)
{
uint8_t数据[3];
数据[0]=0x50 |地址;
数据[1]=0x01;
数据[2]=数值;
HAL_GPIO_WritePin(GPIOC、芯片选择_引脚、GPIO_引脚复位);
HAL_SPI_传输接收器(&hspi3,数据,接收,3,50);
//DWT_延迟(10);
HAL_GPIO_WritePin(GPIOC、芯片选择_引脚、GPIO_引脚集);
}
无效adc_写入_命令(uint8_t命令)
{
HAL_GPIO_WritePin(GPIOC、芯片选择_引脚、GPIO_引脚复位);
HAL_SPI_传输接收器(&hspi3,&command,receive,1,50);
//DWT_延迟(10);
HAL_GPIO_WritePin(GPIOC、芯片选择_引脚、GPIO_引脚集);
}
int adc_read()
{
uint8_t datacon;
uint32\u t convert=0x00;
HAL_GPIO_WritePin(GPIOC、芯片选择_引脚、GPIO_引脚复位);
adc_write_命令(0x01);//读取

对于(int i=0;iYou应该添加函数代码
MX_SPI3_Init
此外,我认为STM32能够自动管理NSS信号,您不必通过切换GPIO来管理它。@GuillaumePetitjean我在代码中添加了MX_SPI3_Init。我刚刚分享了代码片段。我没有使用NSS pin,而是使用了GPIO port for chip_select。我在上面也提到了我的spi_init配置。你能准确地指出问题的实际位置吗?或者只需要很少的额外规格。这对我的开发更有帮助。“我在代码中添加了MX_SPI3_init”抱歉,我认为您没有这样做。我说的是函数的实现。您还调用了两次此函数(即使这可能不是根本原因)。如果STM32是主控,并且您看到它发送数据(如您所说,在MOSI上),我不明白为什么时钟没有移动。SPI的设置可能会很困难,但据我所知,主设备总是会将时钟信号与数据一起发送。@GuillaumePetitjean时钟问题目前已解决。但通信不正确,因为我正在adc中写入寄存器,当我再次尝试读取时,它会显示一些dif不同的值。我注意到我启动了两次,并正确地更改了它。我能否获得此通信的正确值。我想从adc板的模拟输入通道0获取数字数据。我真的不知道问题出在哪里。