isme
isme - 认证专家
冰镇大西瓜

注册于 2年前

回答
290
文章
19
关注者
26

HSPI只能做为从机,最高时钟频率50MHZ,跟普通SPI用法有些许区别。
LSPI可以做为主机,最高时钟频率20MHZ,跟普通SPI用法完全一致。

我重新弄了一个驱动,板子自身也有发热的情况,可能本身硬件精度就不是很好。

/***************************************************************************** 
* 
* File Name : main.c
* 
* Description: main 
* 
* Copyright (c) 2014 Winner Micro Electronic Design Co., Ltd. 
* All rights reserved. 
* 
* Author : dave
* 
* Date : 2014-6-14
*****************************************************************************/ 
#include "wm_include.h"
#include "wm_i2c.h"
#include "stdio.h"
#include "wm_gpio_afsel.h"

#define I2C_FREQ        (5000)
#define I2C_ADDR        (0x80)

u8 buf[4];

void cht8305_iic_init(void)
{
    wm_i2c_scl_config(WM_IO_PA_01);
    wm_i2c_sda_config(WM_IO_PA_04);
    
    tls_i2c_init(I2C_FREQ);
}
 
void cht8305_read_reg(u8 reg_addr,u8 len)
{
    tls_i2c_write_byte(I2C_ADDR, 1); 
    tls_i2c_wait_ack();    
    tls_i2c_write_byte(reg_addr, 0);
    tls_i2c_wait_ack();    
    if (reg_addr == 0x00 || reg_addr == 0x01)
    {
        tls_os_time_delay(5); // 10ms delay
    }
    tls_i2c_write_byte(I2C_ADDR|0x01,1);   

    for (int i = 0; i < len-1; i++) {
        buf[i] = tls_i2c_read_byte(1,0);
    }

    buf[len - 1] = tls_i2c_read_byte(0, 1); //Give NACK
}
void cht8305_get_temp_humi(float *t, float *h)
{
    cht8305_read_reg(0x00, 4);
    unsigned int th, tl, hh, hl;
    th = buf[0];
    tl = buf[1];
    hh = buf[2];
    hl = buf[3];
    (*t) = (th << 8 | tl) * 165.0 / 65535.0 - 40.0;
    (*h) = (hh << 8 | hl) * 100.0 / 65535.0;
}

void UserMain(void)
{
    printf("\n user task \n");
    cht8305_iic_init();
    float  ct8305_temp ;
    float  ct8305_humi;
    while(1)
    {
        cht8305_get_temp_humi(&ct8305_temp,&ct8305_humi);
        printf("upload_hygrotherm ct8305_temp %f,ct8305_humi %f\r\n",ct8305_temp,ct8305_humi);
        tls_os_time_delay(100); // delay 200ms
    }

#if DEMO_CONSOLE
    CreateDemoTask();
#endif
//用户自己的task
}

image.png
image.png

问题需要描述清楚哦,如果是BT经典蓝牙的API使用可以看。
WM_W800_蓝牙系统架构以及API描述_V1.2.pdf

1.主动联网切换WIFI时可以先调用tls_wifi_disconnect();接口断开网络。
2.我看你现在这个流程不是很合理,正常情况下,模块最好通过类似按键的触发机制让模块进入配网模式,配网成功后打开自动重连功能,模块断开连接或者重新上电是能够自动重新连接上WIFI,而当想切换WIFI网络时,重新通过按键或其他触发机制进入配网模式即可。

目前W806不支持OTA升级,如果需要升级,可以通过下拉芯片bootloader脚进入烧录模式,然后通过串口xmodem协议向芯片发送固件升级。

W800默认所有函数都是xip运行,xip相比于ram运行速率更低,如果算法对算力有要求,可以指定一些函数在ram运行,实现方法如下:
  1. 给函数设置attribute
__attribute__((section(".sram.text")))
int TestSram(void)
{
    return 0;
}
  1. 修改gcc_csky.ld,在.data中添加如下一行
  *(.sram.text)
W800还支持某些文件或者某些库的代码段都在ram运行,实现方法如下:
  1. 修改gcc_csky.ld,在.text把下面三行
  *(.text)
  *(.text*)
  *(.text.*)

替换为

  *(EXCLUDE_FILE (*libuser.a *wm_diy_demo.o).text*)
  1. 修改gcc_csky.ld,在.data中添加如下一行
  *(.text*)
W800支持一些只读全局变量加载到ram,实现方法如下
  1. 给全局变量设置attribute
 __attribute__((section(".sram.data")))
char sram_buf[16] = "hello";
  1. 修改gcc_csky.ld,在.data中添加如下一行
  *(.sram.data)

以上内容来源于大神@Alex

目前我们AP+Web配网方式有用到webserver,不过也是文件方式访问,sdk\src\app\web目录下。

W801 作为AP模式,客户端需要先加入W801创建的热点,使客户端和W801处于同一局域网,同时要保证客户端链接的socket server的ip地址和端口号是否正确。

目前还没有,SPI驱动SD网上有很多开源教程,鼓励小伙伴们自行移植并分享到问答社区哦。

发布
问题