使用STM32F103C8T6的SPI驱动ADS1120芯片,内部有四个寄存器,由STM32发送数据拿示波器看了,没问题,就是接收有问题,我写了一个读寄存器命令,将写进ADS1120的四个寄存器读出来检验是否正确,但读出来的都是0xFF,调了一个星期实在找不到问题所在,上来请教请教各位老师。数据通过485发送到电脑上看,UART配置那块程序我就没粘上去了。这是他的命令码与伪代码,我是按照伪代码去编写的程序,但是在读取之前写进去的寄存器数据发现出来的都是0xFF,不知道是没写进去还是说读错了。
#include "stm32f10x.h"
#define ADC_CS_LOW GPIO_ResetBits(GPIOA,GPIO_Pin_4);
#define ADC_CS_HIGN GPIO_SetBits(GPIOA,GPIO_Pin_4);
void UART2Init(void);
void UART2_PutChar(u8 ch);
void Delay_N_ms(unsigned int n);
void SPI_Configuration();
void ADC_RESET();
void SPI1_SendByte(u8 byte);
unsigned char SPI1_ReadByte(u8 byte);
unsigned char temp,ADC_HIGN_DATA,ADC_LOW_DATA;
u16 ADC_Data;
int main(void)
{
SystemInit();
UART2Init();
SPI_Configuration();
ADC_RESET();
while (1)
{
}
}
void SPI_Configuration()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO , ENABLE);
//SPI_NSS 推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//SPI_MISO 浮空输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//SPI_MOSI | SPI_SCK复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//AD_READY信号
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1 , ENABLE);
SPI_Cmd(SPI1, DISABLE); //先禁止才能改变Mode
SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_FullDuplex; //双线双向全双工
SPI_InitStructure.SPI_Mode =SPI_Mode_Master;//设置为主SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//8位数据帧格式
SPI_InitStructure.SPI_CPOL =SPI_CPOL_Low;//SCK引脚在空闲状态保持低电平
SPI_InitStructure.SPI_CPHA =SPI_CPHA_2Edge;//数据捕获于第二个时钟沿
SPI_InitStructure.SPI_NSS =SPI_NSS_Soft;//软件控制NSS信号
SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_8;//比特率预分频值为8
SPI_InitStructure.SPI_FirstBit =SPI_FirstBit_MSB;//数据从高位开始发送
SPI_InitStructure.SPI_CRCPolynomial =7;//定义用于计算CRC的多项式
SPI_Init(SPI1,&SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE);
ADC_CS_HIGN;
}
void ADC_RESET()
{
Delay_N_ms(1);//延时
ADC_CS_LOW;//选中ADC芯片
Delay_N_ms(1);//延时
SPI1_SendByte(0x06);//复位ADC
Delay_N_ms(1);//延时
SPI1_SendByte(0x43);//0x43--01000011,写四个寄存器,从00-11开始写
SPI1_SendByte(0x91);//00寄存器----AIN1为模拟输入管脚,无增益,PGA失能
SPI1_SendByte(0xc0);//01寄存器----数据传输率1000SPS,单次转换模式
SPI1_SendByte(0x00);//10寄存器----内部2.048V参考源
SPI1_SendByte(0x00);//11寄存器----DRAY提示转换结束
SPI1_SendByte(0x23);//读寄存器,查看是否正确
Delay_N_ms(1);//延时
UART2_PutChar(SPI1_ReadByte(0x00));//读取寄存器00
UART2_PutChar(SPI1_ReadByte(0x00));//读取寄存器01
UART2_PutChar(SPI1_ReadByte(0x00));//读取寄存器10
UART2_PutChar(SPI1_ReadByte(0x00));//读取寄存器11
SPI1_SendByte(0x08);//打开ADC转换使能,开始ADC转换
Delay_N_ms(1);//延时
ADC_CS_HIGN;
}
void SPI1_SendByte(u8 byte)
{
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1,byte);
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE) == RESET);
SPI_I2S_ReceiveData(SPI1);
}
unsigned char SPI1_ReadByte(u8 byte)
{
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1,byte);
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE) == RESET);
return SPI_I2S_ReceiveData(SPI1);
}
|