使用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);
- }
|