HSPI 只能做为从机, 最高时钟频率 50MHZ, 跟普通 SPI 用法有些许区别.
LSPI 可以做为主机, 最高时钟频率 20MHZ, 跟普通 SPI 用法完全一致.
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
}
这不就是 AP+Web 配网功能嘛, 看 WM_W800_SDK 命令行编译指南_V1. 0. pdf
问题需要描述清楚哦, 如果是 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 运行, 实现方法如下:
__attribute__ ( (section (". sram. text") ) )
int TestSram (void)
{
return 0;
}
* (. sram. text)
W800 还支持某些文件或者某些库的代码段都在 ram 运行, 实现方法如下:
* (. text)
* (. text*)
* (. text. *)
替换为
* (EXCLUDE_FILE (*libuser. a *wm_diy_demo. o) . text*)
* (. text*)
W800 支持一些只读全局变量加载到 ram, 实现方法如下
__attribute__ ( (section (". sram. data") ) )
char sram_buf[16] = "hello";
* (. sram. data)
以上内容来源于大神@Alex
是不是 SPI DMA 方式驱动?
GPIO 初始化的地方截图看下.
目前我们 AP+Web 配网方式有用到 webserver, 不过也是文件方式访问, sdk\src\app\web 目录下.
W801 作为 AP 模式, 客户端需要先加入 W801 创建的热点, 使客户端和 W801 处于同一局域网, 同时要保证客户端链接的 socket server 的 ip 地址和端口号是否正确.
目前还没有, SPI 驱动 SD 网上有很多开源教程, 鼓励小伙伴们自行移植并分享到问答社区哦.
问 w801 芯片规格书里边的功能描述讲的太简单了, 有详细的功能描述文档吗