新手上路
- 积分
- 33
- 金钱
- 33
- 注册时间
- 2019-4-25
- 在线时间
- 8 小时
|

楼主 |
发表于 2019-5-29 16:43:03
|
显示全部楼层
本帖最后由 yangayi 于 2019-5-29 16:46 编辑
代码如下,不知道那里有错了,搞了一天没搞出来,采集结果一直是4095,望大佬指正,感激……
SPI_HandleTypeDef SPI5_Handler; //SPI句柄
初始化:
void SPIx_Init(void)
{
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_SPI5_CLK_ENABLE(); //使能SPI5时钟
//PF8-SIP5_MISO
GPIO_Initure.Pin=GPIO_PIN_8;
GPIO_Initure.Mode=GPIO_MODE_AF_PP;
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FAST; //快速
GPIO_Initure.Alternate=GPIO_AF5_SPI5; //复用为SPI5
HAL_GPIO_Init(GPIOF,&GPIO_Initure);
//PF9-SPI5_MOSI
GPIO_Initure.Pin=GPIO_PIN_9;
GPIO_Initure.Mode=GPIO_MODE_AF_PP;
HAL_GPIO_Init(GPIOF,&GPIO_Initure);
//PH6-SPI5_CLK
GPIO_Initure.Pin=GPIO_PIN_6;
GPIO_Initure.Mode=GPIO_MODE_AF_PP;
HAL_GPIO_Init(GPIOH,&GPIO_Initure);
//PF10-SPI5_CS
GPIO_Initure.Pin=GPIO_PIN_10; //PF6
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FAST; //快速
HAL_GPIO_Init(GPIOF,&GPIO_Initure); //初始化
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_SET); //置1 MCP3208_CS=1; //cs默认高
SPI5_Handler.Instance=SPI5; //SPI5
SPI5_Handler.Init.Mode=SPI_MODE_MASTER; //设置SPI工作模式,设置为主模式
SPI5_Handler.Init.Direction=SPI_DIRECTION_2LINES; //设置SPI单向或者双向的数据模式:SPI设置为双线模式
SPI5_Handler.Init.DataSize=SPI_DATASIZE_8BIT; //设置SPI的数据大小:SPI发送接收8位帧结构
SPI5_Handler.Init.CLKPolarity=SPI_POLARITY_HIGH; //串行同步时钟的空闲状态为高电平
SPI5_Handler.Init.CLKPhase=SPI_PHASE_2EDGE; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
SPI5_Handler.Init.NSS=SPI_NSS_SOFT; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
SPI5_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_256;//定义波特率预分频的值:波特率预分频值为256
SPI5_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI5_Handler.Init.TIMode=SPI_TIMODE_DISABLE; //关闭TI模式
SPI5_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;//关闭硬件CRC校验
SPI5_Handler.Init.CRCPolynomial=7; //CRC值计算的多项式
HAL_SPI_Init(&SPI5_Handler); //初始化
__HAL_SPI_ENABLE(&SPI5_Handler); //使能SPI5
SPI5_ReadWriteByte(0Xff); //启动传输
}
u8 SPI5_ReadWriteByte(u8 TxData)
{
u8 Rxdata;
HAL_SPI_TransmitReceive(&SPI5_Handler,&TxData,&Rxdata,1, 1000);
return Rxdata; //返回收到的数据
}
//读取第chx通道的AD转换值
u16 SPI_MCP3208_ReadData(u8 ch)
{
u8 byte,data_high,data_low;
byte=0x06;
if(ch>3)
byte|=0x01;
MCP3208_CS=0; //使能器件
SPI5_ReadWriteByte(byte); //发送读取状态寄存器命令
byte=ch<<6;
data_high=SPI5_ReadWriteByte(byte); //读取一个字节
data_high&=0x0f;
data_low=SPI5_ReadWriteByte(0xFF);
MCP3208_CS=1; //取消片选
return ((data_high<<8)|data_low);
}
int main(void)
{
u16 value=0;
u16 times=0;
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
uart_init(115200); //初始化USART
SPIx_Init(); //初始化SPI
while(1)
{
times++;
if(times%500==0)
{
//SPI
value=SPI_MCP3208_ReadData(0);
printf("channel1= %d \n",value);
// value=SPI_MCP3208_ReadData(1);
// printf("channel2= %d \n",value);
// value=SPI_MCP3208_ReadData(2);
// printf("channel3= %d \n",value);
// value=SPI_MCP3208_ReadData(3);
// printf("channel4= %d \n",value);
// value=SPI_MCP3208_ReadData(4);
// printf("channel5= %d \n",value);
// value=SPI_MCP3208_ReadData(5);
// printf("channel6= %d \n",value);
// value=SPI_MCP3208_ReadData(6);
// printf("channel7= %d \n",value);
// value=SPI_MCP3208_ReadData(7);
// printf("channel8= %d \n",value);
}
delay_ms(10);
}
}
|
|