数码之家

 找回密码
 立即注册
搜索
查看: 4739|回复: 17

[STM] STM32+BQ34Z100+蓝牙串口通讯

[复制链接]
发表于 2019-9-10 16:44:00 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位大神们,小弟有个问题请教。
目前想用单片机通过IIC读取BQ34z100里的电压,电流,容量,温度等数据然后通过蓝牙发送,手机端软件显示。
手机端软件用APP Inventor做的,界面是这样的。刚刚学习使用还不是很熟,对收到的数据只能分段分配显示出来,比如:蓝牙收到4800020003659920000,就会分配到电压48V,电流2A,温度36.5,RSOC 99%,FCC 20000mAh。
界面.jpg
现在不知道单片可不可以将IIC读到的数据1数据2数据3数据4数据5这样一次发出来?是不是要设置6寄存器,5个用来存读到的数据,把5个寄存器的数据排列放到第6个里,然后串口发出来?
程序里要怎么写才能排列这5个数据呢?

发表于 2019-9-10 22:08:11 | 显示全部楼层
拼接字符串了解下
回复 支持 反对

使用道具 举报

发表于 2019-9-11 00:28:08 | 显示全部楼层
寄存器和变量能分清吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-11 10:39:33 | 显示全部楼层
595953427@qq 发表于 2019-9-11 00:28
寄存器和变量能分清吗?

分不清,零基础,在别人的程序上修改。
回复 支持 反对

使用道具 举报

发表于 2019-9-11 12:27:02 | 显示全部楼层
秦昌磊 发表于 2019-9-11 10:39
分不清,零基础,在别人的程序上修改。

寄存器是厂家给的,可以控制芯片;变量是自己定义的,一般是用来运算。
这下能分清了吗?
回复 支持 反对

使用道具 举报

发表于 2019-9-11 13:40:02 | 显示全部楼层
贴源码!根据你的描述,最简单,应该可以放在while大循环里,读5个寄存器。每读一个,用sprintf格式化到缓存下,然后可选strcat,strcpy,memcpy,等等等等。。。。进行拼接就行了,注意那几个库函数使用上的坑。应该可以解决你的问题。:loveliness::loveliness::loveliness:
回复 支持 反对

使用道具 举报

发表于 2019-9-11 17:26:22 | 显示全部楼层
数据连串发出来不是难题,倒是一串数据怎么结束,还会继续让你头大的。:lol:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-12 10:23:13 | 显示全部楼层
595953427@qq 发表于 2019-9-11 12:27
寄存器是厂家给的,可以控制芯片;变量是自己定义的,一般是用来运算。
这下能分清了吗?
...

谢谢,这下知道啦。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-12 10:24:11 | 显示全部楼层
infozx 发表于 2019-9-11 17:26
数据连串发出来不是难题,倒是一串数据怎么结束,还会继续让你头大的。 ...

一串数据发完后加个回车可以吗,看好多都是这样的,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-12 10:26:48 | 显示全部楼层
liujingjushi 发表于 2019-9-11 13:40
贴源码!根据你的描述,最简单,应该可以放在while大循环里,读5个寄存器。每读一个,用sprintf格式化到缓 ...

源码现在有iic读BQ34Z100的,也有串口通讯的源码,还有OLED的源码。把这三个程序整合成一个我需要的。
回复 支持 反对

使用道具 举报

发表于 2019-9-12 11:24:24 | 显示全部楼层
你不把代码发上来,完全看不明白你要说的是什么...


printf( "%d%d%d%d%d" , 48000, 2000,365, 99, 20000 );
就可以打出来了.
或者一次次打,这样就只需要一个临时变量.



回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-12 23:05:10 | 显示全部楼层
这是IIC.C里的程序
#include "myiic.h"
#include "delay.h"

void SDA_OUT(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
}

void SDA_IN(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
}

void IIC_Init(void)
{                       
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        SCL_H;
        SDA_H;
}

void IIC_Start(void)
{
        SDA_OUT();
        SDA_H;
        SCL_H;
        delay_us(4);
        SDA_L;
        delay_us(4);
        SCL_L;
}

void IIC_Stop(void)
{
        SDA_OUT();
        SCL_L;
        SDA_L;
        delay_us(2);
        SCL_H;
        SDA_H;
        delay_us(4);
}

void IIC_Ack(void)
{
        SCL_L;
        SDA_OUT();
        SDA_L;
        delay_us(2);
        SCL_H;
        delay_us(2);
        SCL_L;
}

void IIC_NAck(void)
{
        SCL_L;
        SDA_OUT();
        SDA_H;
        delay_us(2);
        SCL_H;
        delay_us(2);
        SCL_L;
}       
  
void IIC_Write_Byte(u_8 txd)
{                        
        u_8 t;
       
        SDA_OUT();
        SCL_L;
        for(t = 0; t < 8; t++)
        {
                if ((txd << t) & 0x80)
                        SDA_H;
                else
                        SDA_L;
                delay_us(2);
                SCL_H;
                delay_us(2);
                SCL_L;
                delay_us(2);
        }
}

u8 IIC_Read_Byte(void)
{
        uint8_t i = 0;
        uint8_t data = 0;
       
        SDA_H;
        SDA_IN();
        for (i = 0; i < 8; i++)
        {
                SCL_L;
                delay_us(4);
                SCL_H;
                delay_us(1);
    data = (data << 1);
    if (READ_SDA)
                        data++;
                delay_us(2);
        }
  
        return data;
}


这是BQ34Z100.C里的程序
#include "bq34.h"

u8 IIC_Wait_Ack(void)
{
        u16 ucErrTime = 0;
        SDA_IN();
        SDA_H;
        delay_us(4);          
        SCL_H;
        delay_us(4);         
        while(READ_SDA)
        {
                ucErrTime++;
                if(ucErrTime > 250)
                {
                        IIC_Stop();
                        return 1;
                }
        }
        SCL_L;  
        return 0;  
}


void Bq34z100_Write_nByte(u8 *pBuff, u8 num)
{
        u8 i = 0;
                        
        IIC_Start();
        IIC_Write_Byte(BQ34Z100_WRITE);
        IIC_Wait_Ack();
        for(i = 0;i < num; i++)
        {
                IIC_Write_Byte(*pBuff);
                IIC_Wait_Ack();
                pBuff++;
        }
//        IIC_Stop();
}

void Bq34z100_Read_nByte(u8 *pBuff, u8 num)
{
        u8 i = 0;
       
        IIC_Start();
        IIC_Write_Byte(BQ34Z100_READ);
        IIC_Wait_Ack();
        for(i = 0;i < num; i++)
        {
                *pBuff = IIC_Read_Byte();
                if (i != (num - 1))
                        IIC_Ack();
                pBuff++;
        }       
        IIC_NAck();
        IIC_Stop();       
}


void Bq34z100_Read_nByte   ,  void Bq34z100_Write_nByte这两句不懂什么意思?
回复 支持 反对

使用道具 举报

发表于 2019-9-14 15:16:32 | 显示全部楼层
秦昌磊 发表于 2019-9-12 23:05
这是IIC.C里的程序
#include "myiic.h"
#include "delay.h"

连续读取,连续写入n个寄存器,地址会顺序自加
回复 支持 反对

使用道具 举报

发表于 2019-9-24 19:28:10 | 显示全部楼层
楼主能分享一下您的工程文件吗?我现在也在调Bq34z100这个芯片,谢谢啦
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-25 15:04:56 | 显示全部楼层
现在单片机和BQ34z100已经实现通讯,示波器观察波形读出的数据也是OK的,波形可以看下附件,
现在读出的数据都是占两个字节的,比如电压高8位在buff_send[0],低8位在buff_send[1]。
现在不知道怎么处理这个数据让他在OLED上显示。大神们指点一下。
BQ34Z100通讯波形.jpg
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-25 15:05:44 | 显示全部楼层
秦昌磊 发表于 2019-9-25 15:04
现在单片机和BQ34z100已经实现通讯,示波器观察波形读出的数据也是OK的,波形可以看下附件,
现在读出的数 ...

图片压缩太厉害看不出写的字啦,晕死
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-8 16:53:50 | 显示全部楼层
秦昌磊 发表于 2019-9-12 23:05
这是IIC.C里的程序
#include "myiic.h"
#include "delay.h"

*pBuff定义成short就可以通过移位后在或指令组合。左后串口输出5组数据。
回复 支持 反对

使用道具 举报

发表于 2020-10-21 23:15:50 | 显示全部楼层
johnaliux 发表于 2019-9-14 15:16
连续读取,连续写入n个寄存器,地址会顺序自加

您的工程文件吗?我现在也在调Bq34z100这个芯片,QQ469270198 ,麻烦联系我下谈下,谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-5-11 04:33 , Processed in 0.124800 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表