BL0942功耗模块在物联网设备中的应用比较广泛,本博文完成ESP32基于SPI接口驱动功耗BL0942模块(上海贝岭公司)的寄存器的读写,从而可以完成寄存器模式的配置,以及读取寄存器的值完成电流电压,功率等值的计算。
在通信模式下,先发送 8bit 识别字节(0x58) 或(0xA8), (0x58)是读操作识别字节, (0xA8)是写操作
识别字节,然后再发送寄存器地址字节,决定访问寄存器的地址。下图分别示出读出和写入操作的数据传送顺序。 一帧数据传送完成, BL0942 重新进入通信模式。每次读/写操作所需的 SCLK 的脉冲个数均为 48 位。
参考:【ESP32-IDF】 02-4 外设-SPI_Ciaran-byte的博客
SPI资源描述
esp32一共有4个spi外设。
SPI0和SPI1是专有SPI,其中SPI0是私有的,用于系统主flash的,不对用户开放。SPI1只能用于主机模式,引脚与SPI0共用,用于操作系统主flash。SPI0与SPI1共用同一个总线判决器。
SPI2和SPI3是通用SPI,给用户使用,用于驱动外部设备。SPI2也叫做HSPI,SPI3也叫做VSPI。SPI2和SPI3的引脚可以任意安排。并且每个SPI可以使用三个片选线。意味着每个SPI外设可以同时驱动三组设备。
数据格式:
发送 :读写cmd + 寄存器address
返回: data_l + data_m + data_r + checksum
说明:BL0942模块通讯都是 3byte , 不足 24bit 的高位补零,,注意大小端格式
数据格式: 读写cmd + 寄存器address + data_l + data_m + data_r + checksum 每帧共6 byte ,其中发送数据为4byte
esp_err_t bl0942_spi_bus_init(){
esp_err_t ret;
ESP_LOGI(TAG, "Initializing bus SPI%d...", EEPROM_HOST+1);
spi_bus_config_t buscfg={
.miso_io_num = PIN_NUM_MISO,
.mosi_io_num = PIN_NUM_MOSI,
.sclk_io_num = PIN_NUM_CLK,
.quadwp_io_num = -1,
.quadhd_io_num = -1,
.max_transfer_sz = 60*8, // 最大传输值
};
ret = spi_bus_initialize(EEPROM_HOST, &buscfg, DMA_CHAN); // esp32 spi 接口初始化
ESP_ERROR_CHECK(ret);
if(ret==ESP_OK)
printf("Initializing esp32_spi_bus success! \r\n");
return ret;
}
//Attach the LCD to the SPI bus
esp_err_t bl0942_spi_bus_add_device(){
esp_err_t ret;
spi_device_interface_config_t devcfg={
.address_bits = 8, //配置地址位长度,如果设置为0,在通讯的时候就不会发送地址位
.command_bits = 8, //配置命令位长度
.clock_speed_hz = 800*1000, // 800 khz
.mode = 1, //SPI mode 1
/*从EEPROM读取忙信号的时序要求不能容易地被SPI事务模拟。我们需要通过SW控制CS引脚来手动检查忙信号*/
.spics_io_num = -1,
.queue_size = 7, //传输队列大小,决定了等待传输数据的数量
.flags = SPI_DEVICE_HALFDUPLEX | SPI_DEVICE_POSITIVE_CS, //半双工通信
};
ret=spi_bus_add_device(EEPROM_HOST, &devcfg, &spi);
ESP_ERROR_CHECK(ret);
if(ret==ESP_OK)
printf("bl0942_spi_bus_add_device success! \r\n");
return ret;
}