- #define SET_CLEAR() GPIO_SetBits(GPIOD, GPIO_Pin_0) // AD5420_CLEAR -> PD0
- #define CLR_CLEAR() GPIO_ResetBits(GPIOD, GPIO_Pin_0)
- #define SET_LATCH() GPIO_SetBits(GPIOB, GPIO_Pin_12) // AD5420_LATCH -> PB12
- #define CLR_LATCH() GPIO_ResetBits(GPIOB, GPIO_Pin_12)
- #define SET_SCL() GPIO_SetBits(GPIOB, GPIO_Pin_13) // AD5420_SCLK -> PB13
- #define CLR_SCL() GPIO_ResetBits(GPIOB, GPIO_Pin_13)
- #define SET_SDO() GPIO_SetBits(GPIOB, GPIO_Pin_15) // AD5420_SDIN -> PB15
- #define CLR_SDO() GPIO_ResetBits(GPIOB, GPIO_Pin_15)
- void AD5420_IO_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- // SPI_InitTypeDef SPI_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
- // RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE );//SPI2时钟使能
- // input:PD0->CLEAR; PB12->LATCH; PB13->SCLK; PB15->SDIN; output:PB14->SDIO; PD1->FAULT
- // gpio配置
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // PD0->CLEAR
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOD, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_15; // PB12->LATCH; PB13->SCLK; PB15->SDIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // PD1->FAULT
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//开漏输出
- // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOD, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; // PB14->SDO
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_ResetBits(GPIOB, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_15);
- GPIO_ResetBits(GPIOD, GPIO_Pin_0);
- }
- void AD5420_WriteData(uint8_t count, uint8_t *ad5420buf)
- {
- uint8_t ValueToWrite = 0;
- uint8_t i = 0;
- uint8_t j = 0;
- CLR_LATCH(); // 先拉低LATCH片选线
- for (i = count; i > 0; i--)
- {
- ValueToWrite = *(ad5420buf + i - 1);
- for (j = 0; j < 8; j++)
- {
- CLR_SCL();
- if (0x80 == (ValueToWrite & 0x80))
- {
- SET_SDO();
- }
- else
- {
- CLR_SDO();
- }
- delay_ms(50);
- SET_SCL();
- // delay_us(100);
- ValueToWrite <<= 1;
- }
- }
- CLR_SCL();
- delay_us(500);
- SET_LATCH();
- delay_us(500);
- CLR_LATCH();
- }
- void Ad5420_Init(void)
- {
- ad5420buf[2] = 0x56; // 复位寄存器地址
- ad5420buf[1] = 0x00;
- ad5420buf[0] = 0x01;
- AD5420_WriteData(3, ad5420buf);
- delay_ms(100);
- ad5420buf[2] = 0x55; // 可寻址控制寄存器地址
- // ad5420buf[1] = 0x10; //OUTEN=1,输出使能
- ad5420buf[1] = 0x30; // REXT=1,外部电流设置电阻;OUTEN=1,输出使能;禁能数字压摆率控制;菊花链禁能
- ad5420buf[0] = 0x05; // 4~20mA
- // ad5420buf[0] = 0x06; //0~20mA
- // ad5420buf[0] = 0x07; //0~24mA
- AD5420_WriteData(3, ad5420buf);
- delay_us(100);
- }
- void Write_Ad5420_Data(void)
- {
- // Ad5420_Init();
- ad5420buf[2] = 0x01;//数据寄存器
- ad5420buf[1] = 0x00;
- ad5420buf[0] = 0x00;//4mA
- AD5420_WriteData(3,ad5420buf);
- // ad5420buf[2] = 0x01; // 数据寄存器
- // ad5420buf[1] = 0x60;
- // ad5420buf[0] = 0x00; // 10mA
- // AD5420_WriteData(3, ad5420buf);
- delay_us(1000);
- // ad5420buf[2] = 0x01;//数据寄存器
- // ad5420buf[1] = 0xFF;
- // ad5420buf[0] = 0xFF;//20mA
- // AD5420_WriteData(3,ad5420buf);
- // delay_us(2000);
- GPIO_SetBits(GPIOD, GPIO_Pin_0);
- delay_ms(200);
- GPIO_ResetBits(GPIOD, GPIO_Pin_0);
- delay_ms(200);
- }
复制代码
|