STM32F103的SPI及IIC外设C代码配置及SimuLink调用

17 篇文章 4 订阅
13 篇文章 1 订阅

接前文所述,操作SPI和IIC通讯,前文已经说过的东西将不在描述

1、新建工程

        略

2、根据硬件配置IO及时钟树

        略

3、配置SPI通讯

       片选用IO控制就可

4、IIC配置

5、代码生成

        略

6、配置成时间片轮询模式

        略

7、配置SPI通讯底层

/*BspSPI.c*/
#include "BspSPI.h"
#include "BstGPIO.h"


/**
 * @brief    SPI发送指定长度的数据
 * @param    buf  —— 发送数据缓冲区首地址
 * @param    size —— 要发送数据的字节数
 * @retval   成功返回HAL_OK
 */
unsigned char SPI1_Transmit(uint8_t* send_buf, uint16_t size)
{
	unsigned char RetureData;
	SPI1CS(L);
	RetureData = HAL_SPI_Transmit(&hspi1, send_buf, size, 100);
	SPI1CS(H);
	return RetureData;
}

/**
 * @brief   SPI接收指定长度的数据
 * @param   buf  —— 接收数据缓冲区首地址
 * @param   size —— 要接收数据的字节数
 * @retval  成功返回HAL_OK
 */
unsigned char SPI1_Receive(uint8_t* recv_buf, uint16_t size)
{
	unsigned char RetureData;
	SPI1CS(L);
	RetureData = HAL_SPI_Receive(&hspi1, recv_buf, size, 100);
	SPI1CS(H);
	return RetureData;
}


/**
 * @brief   SPI在发送数据的同时接收指定长度的数据
 * @param   send_buf  —— 接收数据缓冲区首地址
 * @param   recv_buf  —— 接收数据缓冲区首地址
 * @param   size —— 要发送/接收数据的字节数
 * @retval  成功返回HAL_OK
 */
unsigned char SPI1_TransmitReceive(uint8_t* send_buf, uint8_t* recv_buf, uint16_t size)
{
	unsigned char RetureData;
	SPI1CS(L);
	RetureData = HAL_SPI_TransmitReceive(&hspi1, send_buf, recv_buf, size, 100);
	SPI1CS(H);
	return RetureData;
}
/*BspSPI.h*/
#ifndef __BSPSPI_H__
#define __BSPSPI_H__

#include "AppTask.h"



#define SPI1CS(x) HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,x)


unsigned char SPI1_Transmit(uint8_t* send_buf, uint16_t size);
unsigned char SPI1_Receive(uint8_t* recv_buf, uint16_t size);
unsigned char SPI1_TransmitReceive(uint8_t* send_buf, uint8_t* recv_buf, uint16_t size);



#endif

8、IIC底层用于ADS1115芯片通讯

//i2c_ads1115.c
#include "BSP_i2c_ads1115.h"

#include "stdlib.h"
 
void ads1115_config_register(I2C_HandleTypeDef ads1115_I2cHandle,uint8_t pointADD,uint8_t configH,uint8_t configL)
{
    uint8_t reg_data[3]={pointADD,configH,configL};
    while(HAL_I2C_Master_Transmit(&ads1115_I2cHandle, ADS1115_WRITE_ADDRESS, reg_data, 3, 1000) != HAL_OK)
    {
        if(HAL_I2C_GetError(&ads1115_I2cHandle) != HAL_I2C_ERROR_AF)
        {
            
        }
    }
}
int16_t ads1115_read_data(I2C_HandleTypeDef ads1115_I2cHandle)
{
    int16_t data;
    uint8_t rx_data[2]={0};
 
    while(HAL_I2C_Master_Transmit(&ads1115_I2cHandle, ADS1115_WRITE_ADDRESS, 0x00, 1, 1000) != HAL_OK)
    {
        if(HAL_I2C_GetError(&ads1115_I2cHandle) != HAL_I2C_ERROR_AF)
        {
            
        }
    }
 
    while(HAL_I2C_Master_Receive(&ads1115_I2cHandle, ADS1115_READ_ADDRESS, rx_data, 2, 1000) != HAL_OK)
    {
        if(HAL_I2C_GetError(&ads1115_I2cHandle) != HAL_I2C_ERROR_AF)
        {
            
        }
    }
 
    data=((rx_data[0]<<8) | rx_data[1]);
    return data;
}
 
double ads1115_get_voltage_val(I2C_HandleTypeDef ads1115_I2cHandle,uint8_t pointADD,uint8_t configH,uint8_t configL)
{
    double val;
    int16_t ad_val;
	uint16_t uad_val;
 
    ads1115_config_register(ads1115_I2cHandle,pointADD,configH,configL);
    HAL_Delay(10);
    ad_val=ads1115_read_data(ads1115_I2cHandle);
	uad_val = ad_val;
    if((uad_val==0x7FFF)|(uad_val == 0X8000))//是否超量程了--32767
    {
        ad_val=0;
    }
 
    switch((0x0E&configH)>>1)//量程对应的分辨率
    {
        case(0x00):
            val=(double)ad_val*187.5/1000000.0;//
        break;
        case(0x01):
            val=(double)ad_val*125/1000000.0;
        break;
        case(0x02):
            val=(double)ad_val*62.5/1000000.0;
        break;
        case(0x03):
            val=(double)ad_val*31.25/1000000.0;
        break;
        case(0x04):
            val=(double)ad_val*15.625/1000000.0;
        break;
        case(0x05):
            val=(double)ad_val*7.8125/1000000.0;
        break;
    }
    return val;
 
}

//采集最小单位为uV,需要先ads1115_config_register(ads1115_I2cHandle,pointADD,configH,configL);10ms后再运行此项目
int64_t ads1115_get_voltage_val_uV(I2C_HandleTypeDef ads1115_I2cHandle,uint8_t pointADD,uint8_t configH,uint8_t configL)
{
    int64_t val;
    int16_t ad_val;
	uint16_t uad_val;
 
    //ads1115_config_register(ads1115_I2cHandle,pointADD,configH,configL);
    //HAL_Delay(10);
    ad_val=ads1115_read_data(ads1115_I2cHandle);
	uad_val = ad_val;
    if((uad_val==0x7FFF)|(uad_val == 0X8000))//是否超量程了--32767
    {
        ad_val=0;
    }
 
    switch((0x0E&configH)>>1)//量程对应的分辨率
    {
        case(0x00):
            val=(int64_t)ad_val*1875/10;//分辨率187.5uV ±6.144V
        break;
        case(0x01):
            val=(int64_t)ad_val*125;//分辨率125uV ±4.096V
        break;
        case(0x02):
            val=(int64_t)ad_val*625/10;//分辨率62.5uV ±2.048V
        break;
        case(0x03):
            val=(int64_t)ad_val*3125/100;//分辨率31.25uV ±1.024V
        break;
        case(0x04):
            val=(int64_t)ad_val*15625/1000;//分辨率15.625uV ±0.512V
        break;
        case(0x05):
            val=(int64_t)ad_val*78125/10000;//分辨率7.8125uV ±0.256V
        break;
    }
    return val;
 
}


//配置ADS1115-选通道0--共模端采集AIN3电压及输出电压,1--差分输入0引脚和3引脚电压,及电流值,2--共模采集AIN1电压1~5V参考电压
void Conf_ADS1115(unsigned char num)
{
	switch(num)
	{
		case 0:ads1115_config_register(hi2c1,0x01,ADS1115_REG_CONFIG_OS_START|ADS1115_REG_CONFIG_MUX_SINGLE_3|ADS1115_REG_CONFIG_PGA_6|ADS1115_REG_CONFIG_MODE_SINGLE,CONFIG_REG_L);break;
		case 1:ads1115_config_register(hi2c1,0x01,ADS1115_REG_CONFIG_OS_START|ADS1115_REG_CONFIG_MUX_Diff_03|ADS1115_REG_CONFIG_PGA_1|ADS1115_REG_CONFIG_MODE_SINGLE,CONFIG_REG_L);break;
		case 2:ads1115_config_register(hi2c1,0x01,ADS1115_REG_CONFIG_OS_START|ADS1115_REG_CONFIG_MUX_SINGLE_1|ADS1115_REG_CONFIG_PGA_6|ADS1115_REG_CONFIG_MODE_SINGLE,CONFIG_REG_L);break;
	}
}
//选通道0--共模端采集AIN3电压及输出电压,1--差分输入0引脚和3引脚电压,及电流值,2--共模采集AIN1电压1~5V参考电压,输出uV。
int Get_Volt_ADS1115_uV(unsigned char num)
{
	int volt;
	switch(num)
	{
		case 0:volt = ads1115_get_voltage_val_uV(hi2c1,0x01,ADS1115_REG_CONFIG_OS_START|ADS1115_REG_CONFIG_MUX_SINGLE_3|ADS1115_REG_CONFIG_PGA_6|ADS1115_REG_CONFIG_MODE_SINGLE,CONFIG_REG_L);break;
		case 1:volt = ads1115_get_voltage_val_uV(hi2c1,0x01,ADS1115_REG_CONFIG_OS_START|ADS1115_REG_CONFIG_MUX_Diff_03|ADS1115_REG_CONFIG_PGA_1|ADS1115_REG_CONFIG_MODE_SINGLE,CONFIG_REG_L);break;
		case 2:volt = ads1115_get_voltage_val_uV(hi2c1,0x01,ADS1115_REG_CONFIG_OS_START|ADS1115_REG_CONFIG_MUX_SINGLE_1|ADS1115_REG_CONFIG_PGA_6|ADS1115_REG_CONFIG_MODE_SINGLE,CONFIG_REG_L);break;
	}
	return volt;
}
	
//自动转换选通道0--共模端采集AIN3电压及输出电压,1--差分输入0引脚和3引脚电压,及电流值,2--共模采集AIN1电压1~5V参考电压,输出uV。
int Get_Volt_ADS1115_Auto_uV(unsigned char num)
{
	int volt;
	switch(num)
	{
		case 0:volt = Get_Volt_ADS1115_uV(0);Conf_ADS1115(1);break;
		case 1:volt = Get_Volt_ADS1115_uV(1);Conf_ADS1115(2);break;
		case 2:volt = Get_Volt_ADS1115_uV(2);Conf_ADS1115(0);break;
	}
	return volt;
}
//i2c_ads1115.h
#ifndef __IIC_ADS1115_H
#define __IIC_ADS1115_H
 
#include "AppTask.h"
#include "i2c.h"
 
#define ADS1115_WRITE_ADDRESS        0x90
#define ADS1115_READ_ADDRESS         0x91
//以下两个预处理作为配置寄存器预处理要更改其配在这里更改
//也可以添加新的预处理对不同通道的采集或者选取不同的采样速率等
#define CONFIG_REG_H     ADS1115_REG_CONFIG_OS_START|\
                         ADS1115_REG_CONFIG_MUX_SINGLE_0|\
                         ADS1115_REG_CONFIG_PGA_05|\
                         ADS1115_REG_CONFIG_MODE_SINGLE

#define CONFIG_REG_L    ADS1115_REG_CONFIG_DR_128|\
                        ADS1115_REG_CONFIG_COMP_MODE_TRADITIONAL|\
                        ADS1115_REG_CONFIG_COMP_POL_LOW|\
                        ADS1115_REG_CONFIG_COMP_LAT_NONLATCH|\
                        ADS1115_REG_CONFIG_COMP_QUE_DIS


/***************/
//配置寄存器说明
 
//config register
/*CRH[15:8](R/W)
   BIT      15      14      13      12      11      10      9       8
   NAME     OS      MUX2    MUX1    MUX0    PGA2    PGA1    PGA0    MODE
CRL[7:0] (R/W)
   BIT      7       6       5       4       3       2       1       0
   NAME    DR0     DR1     DR0   COM_MODE COM_POL COM_LAT COM_QUE1 COM_QUE0
   -----------------------------------------------------------------------------------
 * 15    | OS             |  运行状态会单词转换开始
 *       |                | 写时:
 *       |                | 0   : 无效
 *       |                | 1   : 开始单次转换处于掉电状态时
 *       |                | 读时:
 *       |                | 0   : 正在转换
 *       |                | 1   : 未执行转换
 * -----------------------------------------------------------------------------------
 * 14:12 | MUX [2:0]      | 输入复用多路配置
 *       |                | 000 : AINP = AIN0 and AINN = AIN1 (default)
 *       |                | 001 : AINP = AIN0 and AINN = AIN3
 *       |                | 010 : AINP = AIN1 and AINN = AIN3
 *       |                | 011 : AINP = AIN2 and AINN = AIN3
 *       |                | 100 : AINP = AIN0 and AINN = GND
 *       |                | 101 : AINP = AIN1 and AINN = GND
 *       |                | 110 : AINP = AIN2 and AINN = GND
 *       |                | 111 : AINP = AIN3 and AINN = GND
 * -----------------------------------------------------------------------------------
 * 11:9  | PGA [2:0]      | 可编程增益放大器配置(FSR  full scale range)
 *       |                | 000 : FSR = В±6.144 V
 *       |                | 001 : FSR = В±4.096 V
 *       |                | 010 : FSR = В±2.048 V (默认)
 *       |                | 011 : FSR = В±1.024 V
 *       |                | 100 : FSR = В±0.512 V
 *       |                | 101 : FSR = В±0.256 V
 *       |                | 110 : FSR = В±0.256 V
 *       |                | 111 : FSR = В±0.256 V
 * -----------------------------------------------------------------------------------
 * 8     | MODE           | 工作模式
 *       |                | 0   : 连续转换
 *       |                | 1   : 单词转换
 * -----------------------------------------------------------------------------------
 * 7:5   | DR [2:0]       | 采样频率
 *       |                | 000 : 8 SPS
 *       |                | 001 : 16 SPS
 *       |                | 010 : 32 SPS
 *       |                | 011 : 64 SPS
 *       |                | 100 : 128 SPS (默认)
 *       |                | 101 : 250 SPS
 *       |                | 110 : 475 SPS
 *       |                | 111 : 860 SPS
 * -----------------------------------------------------------------------------------
 * 4     | COMP_MODE      | 比较器模式
 *       |                | 0   : 传统比较器 (default)
 *       |                | 1   : 窗口比较器
 * -----------------------------------------------------------------------------------
 * 3     | COMP_POL       | Comparator polarity
 *       |                | 0   : 低电平有效 (default)
 *       |                | 1   : 高电平有效
 * -----------------------------------------------------------------------------------
 * 2     | COMP_LAT       | Latching comparator
 *       |                | 0   : 非锁存比较器. (default)
 *       |                | 1   : 锁存比较器.
 * -----------------------------------------------------------------------------------
 * 1:0   | COMP_QUE [1:0] | Comparator queue and disable
 *       |                | 00  : Assert after one conversion
 *       |                | 01  : Assert after two conversions
 *       |                | 10  : Assert after four conversions
 *       |                | 11  : 禁用比较器并将ALERT/RDY设置为高阻抗 (default)
 * -----------------------------------------------------------------------------------
*/
 
 
 
//地址指针寄存器
 
#define ADS1015_REG_POINTER_CONVERT     (0x00)
#define ADS1015_REG_POINTER_CONFIG      (0x01)
#define ADS1015_REG_POINTER_LOWTHRESH   (0x02)
#define ADS1015_REG_POINTER_HITHRESH    (0x03)
// 单次转换开始
#define ADS1115_REG_CONFIG_OS_START                     (0x1U << 7)//设备单次转换开启 高字节的最高位
#define ADS1115_REG_CONFIG_OS_NULL                      (0x0U << 7)
//输入引脚选择和输入方式选择
#define ADS1115_REG_CONFIG_MUX_Diff_01                  (0x0U << 4)  // 差分输入0引脚和1引脚
#define ADS1115_REG_CONFIG_MUX_Diff_03                  (0x1U << 4)  // 差分输入0引脚和3引脚
#define ADS1115_REG_CONFIG_MUX_Diff_13                  (0x2U << 4)  // 差分输入1引脚和3引脚
#define ADS1115_REG_CONFIG_MUX_Diff_23                  (0x3U << 4)  // 差分输入2引脚和3引脚
#define ADS1115_REG_CONFIG_MUX_SINGLE_0                 (0x4U << 4)  //单端输入 0
#define ADS1115_REG_CONFIG_MUX_SINGLE_1                 (0x5U << 4)  //单端输入 1
#define ADS1115_REG_CONFIG_MUX_SINGLE_2                 (0x6U << 4)  //单端输入 2
#define ADS1115_REG_CONFIG_MUX_SINGLE_3                 (0x7U << 4)  //单端输入 3
 
//量程选择
#define ADS1115_REG_CONFIG_PGA_6                        (0x0U << 1) // +/- 6.1144
#define ADS1115_REG_CONFIG_PGA_4                        (0x1U << 1) // +/- 4.096
#define ADS1115_REG_CONFIG_PGA_2                        (0x2U << 1) // +/- 2.048
#define ADS1115_REG_CONFIG_PGA_1                        (0x3U << 1) // +/- 1.024
#define ADS1115_REG_CONFIG_PGA_05                       (0x4U << 1) // +/- 0.512
#define ADS1115_REG_CONFIG_PGA_02                       (0x5U << 1) // +/- 0.256
 
//运行方式
 
#define ADS1115_REG_CONFIG_MODE_SINGLE              (0x1U << 0)  //  单次
#define ADS1115_REG_CONFIG_MODE_CONTIN              (0x0U << 0)  //连续转换
 
//转换速率
 
#define ADS1115_REG_CONFIG_DR_8                     (0x0U << 5)
#define ADS1115_REG_CONFIG_DR_16                    (0x1U << 5)
#define ADS1115_REG_CONFIG_DR_32                    (0x2U << 5)
#define ADS1115_REG_CONFIG_DR_64                    (0x3U << 5)
#define ADS1115_REG_CONFIG_DR_128                   (0x4U << 5)
#define ADS1115_REG_CONFIG_DR_250                   (0x5U << 5)
#define ADS1115_REG_CONFIG_DR_475                   (0x6U << 5)
#define ADS1115_REG_CONFIG_DR_860                   (0x7U << 5)
 
//比较器模式
#define ADS1115_REG_CONFIG_COMP_MODE_TRADITIONAL    (0x0U << 4)//默认
#define ADS1115_REG_CONFIG_COMP_MODE_WINDOW         (0x1U << 4)
 
 
#define ADS1115_REG_CONFIG_COMP_POL_LOW         (0x0U << 3)//默认
#define ADS1115_REG_CONFIG_COMP_POL_HIG         (0x1U << 3)
 
 
#define ADS1115_REG_CONFIG_COMP_LAT_NONLATCH        (0x0U << 2)
#define ADS1115_REG_CONFIG_COMP_LAT_LATCH           (0x1U << 2)
 
 
#define ADS1115_REG_CONFIG_COMP_QUE_ONE         (0x0U << 0)
#define ADS1115_REG_CONFIG_COMP_QUE_TWO         (0x1U << 0)
#define ADS1115_REG_CONFIG_COMP_QUE_THR         (0x2U << 0)
#define ADS1115_REG_CONFIG_COMP_QUE_DIS         (0x3U << 0)
 
void ads1115_config_register(I2C_HandleTypeDef ads1115_I2cHandle,uint8_t pointADD,uint8_t configH,uint8_t configL);
int16_t ads1115_read_data(I2C_HandleTypeDef ads1115_I2cHandle);
double ads1115_get_voltage_val(I2C_HandleTypeDef ads1115_I2cHandle,uint8_t pointADD,uint8_t configH,uint8_t configL);
//采集最小单位为uV
int64_t ads1115_get_voltage_val_uV(I2C_HandleTypeDef ads1115_I2cHandle,uint8_t pointADD,uint8_t configH,uint8_t configL);
//配置ADS1115-选通道0--共模端采集AIN3电压及输出电压,1--差分输入0引脚和3引脚电压,及电流值,2--共模采集AIN1电压1~5V参考电压
void Conf_ADS1115(unsigned char num);
//选通道0--共模端采集AIN3电压及输出电压,1--差分输入0引脚和3引脚电压,及电流值,2--共模采集AIN1电压1~5V参考电压,输出uV。
int Get_Volt_ADS1115_uV(unsigned char num);
//自动转换选通道0--共模端采集AIN3电压及输出电压,1--差分输入0引脚和3引脚电压,及电流值,2--共模采集AIN1电压1~5V参考电压,输出uV。
int Get_Volt_ADS1115_Auto_uV(unsigned char num);

#endif

9、SPI对DAC8051E芯片通讯

//BSP_SPI_DAC8501E.c
#include "BSP_SPI_DAC8501E.h"


//发送16bit数据到DAC8051
void DAC8051Out16bit(unsigned short Bit16)
{
	unsigned char SpiTxData[3];
	SpiTxData[0] = 0x00;
	SpiTxData[1] = ((Bit16>>8)&0xff);
	SpiTxData[2] = (Bit16 & 0xff);
	SPI1_Transmit(SpiTxData,3);
}

//发送参考电压及目标电压 0_1mV代表单位0.1mV
void DAC8051Out0_1mV(unsigned short REFmV,unsigned short Out0_1mV)
{
	unsigned int Bit16;
	Bit16 = (Out0_1mV*65535);
	Bit16 = Bit16 / REFmV/10;
	
	DAC8051Out16bit(Bit16);
}
//BSP_SPI_DAC8501E.h
#ifndef __BSP_SPI_DAC8051E_H__
#define __BSP_SPI_DAC8051E_H__

#include "AppTask.h"

//发送16bit数据到DAC8051
void DAC8051Out16bit(unsigned short Bit16);
//发送参考电压及目标电压 0_1mV代表单位0.1mV
void DAC8051Out0_1mV(unsigned short REFmV,unsigned short Out0_1mV);

#endif

10、编写SimuLink映射接口

/*AppToSimuLink.c*/
#include <AppToSimuLink.h>




//重写IO输出驱动
void GPIO_WritePin(unsigned char GPIO0_3_A_D,unsigned char Pin0_15,unsigned char PinState)
{}
//重写IO采集
unsigned char GPIO_ReadPin(unsigned char GPIO0_3_A_D,unsigned char Pin0_15)
{}
//重写IO反转函数
void GPIO_TogglePin(unsigned char GPIO0_3,unsigned char Pin0_15)
{}

//CAN数据发送,ID是CAN地址,TX是要发数据的8个数数组,IDE是扩展帧标志
//注意STM32F103只有3个邮箱,所以一次只能发送3个CAN消息
//如果数据多,3个一组错开发送时间
void CAN_send_1(unsigned int ID,unsigned char TX[8],unsigned char IDE)
{}

/**
 * @brief    SPI发送指定长度的数据
 * @param    buf  —— 发送数据缓冲区首地址
 * @param    size —— 要发送数据的字节数
 * @retval   成功返回HAL_OK
 */
unsigned char SPI1_Transmit(unsigned char* send_buf, unsigned short size)
{}
/**
 * @brief   SPI接收指定长度的数据
 * @param   buf  —— 接收数据缓冲区首地址
 * @param   size —— 要接收数据的字节数
 * @retval  成功返回HAL_OK
 */
unsigned char SPI1_Receive(unsigned char* recv_buf, unsigned short size)
{}
/**
 * @brief   SPI在发送数据的同时接收指定长度的数据
 * @param   send_buf  —— 接收数据缓冲区首地址
 * @param   recv_buf  —— 接收数据缓冲区首地址
 * @param   size —— 要发送/接收数据的字节数
 * @retval  成功返回HAL_OK
 */
unsigned char SPI1_TransmitReceive(unsigned char* send_buf, unsigned char* recv_buf, unsigned short size)
{}
//发送16bit数据到DAC8051
void DAC8051Out16bit(unsigned short Bit16)
{}
//发送参考电压及目标电压 0_1mV代表单位0.1mV
void DAC8051Out0_1mV(unsigned short REFmV,unsigned short Out0_1mV)
{}
//配置ADS1115-选通道0--共模端采集AIN3电压及输出电压,1--差分输入0引脚和3引脚电压,及电流值,2--共模采集AIN1电压1~5V参考电压
void Conf_ADS1115(unsigned char num)
{}
//选通道0--共模端采集AIN3电压及输出电压,1--差分输入0引脚和3引脚电压,及电流值,2--共模采集AIN1电压1~5V参考电压,输出uV。需要先配置
int Get_Volt_ADS1115_uV(unsigned char num)
{}
//自动转换选通道0--共模端采集AIN3电压及输出电压,1--差分输入0引脚和3引脚电压,及电流值,2--共模采集AIN1电压1~5V参考电压,输出uV。自动配置下一条
int Get_Volt_ADS1115_Auto_uV(unsigned char num)
{}
/*AppToSimuLink.h*/


//重写IO输出驱动
void GPIO_WritePin(unsigned char GPIO0_3_A_D,unsigned char Pin0_15,unsigned char PinState);
//重写IO反转函数
void GPIO_TogglePin(unsigned char GPIO0_3,unsigned char Pin0_15);
//重写IO采集
unsigned char GPIO_ReadPin(unsigned char GPIO0_3_A_D,unsigned char Pin0_15);


//CAN数据发送,ID是CAN地址,TX是要发数据的8个数数组,IDE是扩展帧标志
//注意STM32F103只有3个邮箱,所以一次只能发送3个CAN消息
//如果数据多,3个一组错开发送时间
void CAN_send_1(unsigned int ID,unsigned char TX[8],unsigned char IDE);

/**
 * @brief    SPI发送指定长度的数据
 * @param    buf  —— 发送数据缓冲区首地址
 * @param    size —— 要发送数据的字节数
 * @retval   成功返回HAL_OK
 */
unsigned char SPI1_Transmit(unsigned char* send_buf, unsigned short size);
/**
 * @brief   SPI接收指定长度的数据
 * @param   buf  —— 接收数据缓冲区首地址
 * @param   size —— 要接收数据的字节数
 * @retval  成功返回HAL_OK
 */
unsigned char SPI1_Receive(unsigned char* recv_buf, unsigned short size);
/**
 * @brief   SPI在发送数据的同时接收指定长度的数据
 * @param   send_buf  —— 接收数据缓冲区首地址
 * @param   recv_buf  —— 接收数据缓冲区首地址
 * @param   size —— 要发送/接收数据的字节数
 * @retval  成功返回HAL_OK
 */
unsigned char SPI1_TransmitReceive(unsigned char* send_buf, unsigned char* recv_buf, unsigned short size);
//发送16bit数据到DAC8051
void DAC8051Out16bit(unsigned short Bit16);
//发送参考电压及目标电压 0_1mV代表单位0.1mV
void DAC8051Out0_1mV(unsigned short REFmV,unsigned short Out0_1mV);
//配置ADS1115-选通道0--共模端采集AIN3电压及输出电压,1--差分输入0引脚和3引脚电压,及电流值,2--共模采集AIN1电压1~5V参考电压
void Conf_ADS1115(unsigned char num);
//选通道0--共模端采集AIN3电压及输出电压,1--差分输入0引脚和3引脚电压,及电流值,2--共模采集AIN1电压1~5V参考电压,输出uV。需要先配置
int Get_Volt_ADS1115_uV(unsigned char num);
//自动转换选通道0--共模端采集AIN3电压及输出电压,1--差分输入0引脚和3引脚电压,及电流值,2--共模采集AIN1电压1~5V参考电压,输出uV。自动配置下一条
int Get_Volt_ADS1115_Auto_uV(unsigned char num);

11、SimuLink配置

        略(见上期)

12、SimuLink模型搭建更新

13、代码生成

        略

14、验证,注意DAC输出和ADC的0通道绑定,进入DeBug模式

找到设置的变量名称,并在Debug模式中读取

15、验证完成-SPI和IIC都可正常通讯

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逐梦之程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值