社区导航

 

搜索
查看: 1079|回复: 3

[分享] 【MXCHIP Open1081】TCP+AD+18B20和一些问题

[复制链接]

3384

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2014-11-30 14:40 | 显示全部楼层 |阅读模式
本帖最后由 ljj3166 于 2014-11-30 14:57 编辑

上次使用了UDP发送数据到PC
这回试验了一下TCP,顺道驱动了一下18B20和一个AD通道
AD通道挂在Arduino接口的A0端
dasdsa.jpg
A0对应SOC芯片的54管脚,PA1管脚
这里One-Wire硬件上有个很奇怪的地方,没有上拉电阻
没记错的话,18B20数据手册要求是需要上拉的
难道是芯片GPIO配置了上拉?
看了一下驱动代码,好像真是这样
void Onewire_OUT_PULL_UP(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin = DS18B20_Pin;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(DS18B20_Port, &GPIO_InitStructure);        
}

void Onewire_OUT_FLOATING(void)
{

        GPIO_InitTypeDef  GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin = DS18B20_Pin;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(DS18B20_Port, &GPIO_InitStructure);
}

void Onewire_IN_FLOATING(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = DS18B20_Pin;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(DS18B20_Port, &GPIO_InitStructure);        
}

void Onewire_IN_PULL_UP(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = DS18B20_Pin;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(DS18B20_Port, &GPIO_InitStructure);
}

18B20的数据线都进行了内部上拉
不过听说,内部都是弱上拉呢,算不算个隐患呢?
也许这块片子例外吧
看看工程结构吧,直接把文件包含进来了
dasdsa.jpg
基本上就是这么些东西,下面进入问题时间


先帖代码,做了些基本的注释
回复可见,哇咔咔
TCP的代码和UDP稍有区别
#include "stdio.h"
#include "ctype.h"
#include "MX1081_IO.H"
#include "stm32f2xx.h"
#include "platform.h"
#include "mxchipWNET.h"
#include "string.h"
#include "OneWire.h"
#include "18B20.h"
#include "systick.h"

#define ADC1_DR_Address    ((u32)0x4001204C)

void ADC1_CH1_DMA_Config(void);
float AD_value_1;
vu16 ADC_ConvertedValue[2];
#define LowPowerMode
#define AP_NAME           "Ljj@Home"
#define AP_PASSWORD       "xxxxxxxx"  //路由器的密码
#define APP_INFO          "mxchipWNet Demo: Wi-Fi Link"

network_InitTypeDef_st wNetConfig;
net_para_st para;

/* ========================================
        User provide callback functions
    ======================================== */
void system_version(char *str, int len)
{
  snprintf( str, len, "%s", APP_INFO);
}
               
void userWatchDog(void)
{
}

void WifiStatusHandler(int event)
{
  switch (event) {
    case MXCHIP_WIFI_UP:
      printf("Station up \r\n");
      break;
    case MXCHIP_WIFI_DOWN:
      printf("Station down \r\n");
      break;
    case MXCHIP_UAP_UP:
      printf("uAP up \r\n");
      getNetPara(¶, Soft_AP);
      printf("Soft AP mode: IP address: %s \r\n", para.ip);
      printf("Soft AP mode: NetMask address: %s \r\n", para.mask);
      printf("Soft AP mode: MAC address: %s \r\n", para.mac);
      break;
    case MXCHIP_UAP_DOWN:
      printf("uAP down \r\n");
      break;
    default:
      break;
  }
  return;
}

void ApListCallback(UwtPara_str *pApList)
{
        int i;
  printf("Find %d APs: \r\n", pApList->ApNum);
  for (i=0;iApNum;i++)
    printf("    SSID: %s, Signal: %d%%\r\n", pApList->ApList.ssid, pApList->ApList.ApPower);
}

void NetCallback(net_para_st *pnet)
{
        printf("Station mode: IP address: %s \r\n", pnet->ip);
        printf("Station mode: NetMask address: %s \r\n", pnet->mask);
        printf("Station mode: Gateway address: %s \r\n", pnet->gate);
        printf("Station mode: DNS server address: %s \r\n", pnet->dns);
  printf("Station mode: MAC address: %s \r\n", pnet->mac);
}

void stationModeStart(void)
{
        int ret;
  memset(&wNetConfig, 0x0, sizeof(network_InitTypeDef_st));
        
        wNetConfig.wifi_mode = Station;
        strcpy((char*)wNetConfig.wifi_ssid, AP_NAME);
        strcpy((char*)wNetConfig.wifi_key, AP_PASSWORD);
        wNetConfig.dhcpMode = DHCP_Client;
        ret = StartNetwork(&wNetConfig);
        printf("connect to %s....., return %d\r\n", wNetConfig.wifi_ssid, ret);
}

void softAPModeStart(void)
{
  int ret;
  memset(&wNetConfig, 0x0, sizeof(network_InitTypeDef_st));
        
        wNetConfig.wifi_mode = Soft_AP;
  strcpy((char*)wNetConfig.wifi_ssid, "Soft AP test");
  strcpy((char*)wNetConfig.wifi_key, "");
        strcpy((char*)wNetConfig.local_ip_addr, "192.168.0.1");
  strcpy((char*)wNetConfig.net_mask, "255.255.255.0");
        strcpy((char*)wNetConfig.address_pool_start, "192.168.0.10");
        strcpy((char*)wNetConfig.address_pool_end, "192.168.0.177");
        wNetConfig.dhcpMode = DHCP_Server;
        ret = StartNetwork(&wNetConfig);
        printf("Setup soft AP: %s, return %d\r\n", wNetConfig.wifi_ssid, ret);
}

vs32 tick = 0;
vs32 button_irq = 0;

void RptConfigmodeRslt(network_InitTypeDef_st *nwkpara)
{
        if(nwkpara == NULL){
                printf("Configuration failed\r\n");
        }
        else{
                printf("Configuration is successful, SSID:%s, Key:%s\r\n", \
                                                                                                                                                nwkpara->wifi_ssid,\
                                                                                                                                                nwkpara->wifi_key);
        }
}
//上面都是些基础的设置函数和回调函数
char* itostr(char *str, int i) //整型转字符型,便于以太网发送并显示
{
    sprintf(str, "%d", i);
    return str;
}

u16 get_tem()  //18B20驱动函数,可以读到SN号
{
                u8 *p,id[8];
   u16 i,tmp;
                        delay_init();
        Onewire_Enable_GPIO_Port();
        /**----------------------Read ID------------------------*/
        p=readID();
        for(i=0;i<8;i++)
        {id=*p;p++;i++;}
        i=0;
        while(i!=8)
                {printf("0x%x ",id);i++;}
        printf("\r\n");
tmp = readTemp();
                printf("Temperture:%d.%d¡æ\r\n ",tmp/100,tmp%100);
         return tmp;
                 
}


int main(void)
{int fd_listen = -1,fd_client = -1,i,con=-1,j,len;
  fd_set readfds, exceptfds;
  struct timeval_t t;
  struct sockaddr_t addr;
        char *buf,ip_address[16],AD_buff[]="",TMP_buff[]="",SEND_buff[]="";
        int clientfd[8];
//        socklen_t addrLen;
        size_t /*AD_str_len,TMP_str_len,*/SEND_str_len;
  u16 tmp;
        
        for(i=0;i<8;i++)
    clientfd = -1;

  buf = (char*)malloc(3*1024);
        set_tcp_keepalive(3, 60);    //保持TCP连接,必不可少的一句
        

  mxchipInit();
  UART_Init();
        Button_Init();
  printf("\r\n%s\r\nmxchipWNet library version: %s\r\n", APP_INFO, system_lib_version());
  printf("Start scan\r\n");
        mxchipStartScan();
  stationModeStart();  //启用station模式
//  softAPModeStart();
        ADC1_CH1_DMA_Config();   //配置ADC,这里是A0口,PA1,ADC1 CH1
        ADC_SoftwareStartConv(ADC1);
  while(1){
    mxchipTick();
                 //printf("%s\r\n",buf);
                if (fd_listen==-1) {
      fd_listen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  //建立TCP的socket
      addr.s_port = 8081;   //配置端口号
      bind(fd_listen, &addr, sizeof(addr));
      listen(fd_listen, 0);   //监听
      //printf("TCP server established at port: %d \r\n", addr.s_port);
    }
               
               
                /*Check status on erery sockets */
                FD_ZERO(&readfds);
                FD_SET(fd_listen, &readfds);        
                if(fd_client!=-1)
                  FD_SET(fd_client, &readfds);
                for(i=0;i<8;i++)   //貌似是最多支持8个socket套接字
{
                        if (clientfd != -1)
                                FD_SET(clientfd, &readfds);
                }
               
                select(1, &readfds, NULL, &exceptfds, &t);
               
                /*Check tcp connection requests */
                if(FD_ISSET(fd_listen, &readfds))
                {
                        j = accept(fd_listen, &addr, &len);
                        if (j > 0) {
                          inet_ntoa(ip_address, addr.s_ip );
                          printf("Client %s:%d connected\r\n", ip_address, addr.s_port);
                          for(i=0;i<8;i++) {
                                  if (clientfd == -1) {
                                          clientfd = j;
                                          break;
                                  }
                          }
                        }
                }
               
    /*Read data from tcp clients and send data back */
         for(i=0;i<8;i++) {
      if (clientfd != -1) {
        if (FD_ISSET(clientfd, &readfds)) {
          con = recv(clientfd, buf, 3*1024, 0);
          if (con > 0) //如果从TCP获取到数据,就开始执行,这里有些不理解的地方,见下文。
{
                                                tmp = get_tem();
                                                itostr(SEND_buff,tmp/100);
                                                strcat(SEND_buff,".");    //使用标准c中的字符串链接函数,形成发送的buff
                                                itostr(TMP_buff,tmp%100);
                                                strcat(SEND_buff,TMP_buff);
                                                itostr(AD_buff,ADC_ConvertedValue[0]);
                                                strcat(SEND_buff,"&");
                                                strcat(SEND_buff,AD_buff);
                                                SEND_str_len = strlen(SEND_buff)-1; //获取字符串长度
                                                send(clientfd, "Temperture&AD Value:", sizeof("Temperture&AD Value:"), 0);
                                                send(clientfd, SEND_buff, SEND_str_len, 0); //发送数据
                                                send(clientfd, "\r\n", sizeof("\r\n"), 0);
                                        //        printf("Temperture:%s¡æ\r\n ",TMP_buff);
                                        //        printf("AD value:%s,%d\r\n ",AD_buff,AD_str_len);
            //send(clientfd, "AD:", sizeof("AD:"), 0);
                                        //        send(clientfd, AD_buff, AD_str_len, 0);
                                        //        send(clientfd, "\r\n", sizeof("\r\n"), 0);
                                                
                                        }
          else {
            close(clientfd);
            clientfd = -1;
          }
        }
        else if (FD_ISSET(clientfd, &exceptfds))
          clientfd = -1;
      }
    }
        
   //  recvfrom(fd_listen, buf, 3*1024, 0, &addr, &addrLen);                  
    // }
  }
}


void Button_irq_handler(void *arg)
{
  printf("Start scanning by user...\r\n");
  mxchipStartScan();               
}


void ADC1_CH1_DMA_Config(void)
{
  ADC_InitTypeDef       ADC_InitStructure;
  ADC_CommonInitTypeDef ADC_CommonInitStructure;
  DMA_InitTypeDef       DMA_InitStructure;
  GPIO_InitTypeDef      GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOA, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

//  DMA_DeInit(DMA2_Stream0);
  /* DMA2 Stream0 channe0 configuration **************************************/
  DMA_InitStructure.DMA_Channel = DMA_Channel_0;  
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC_ConvertedValue;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  DMA_InitStructure.DMA_BufferSize = 2;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  DMA_Init(DMA2_Stream0, &DMA_InitStructure);
  DMA_Cmd(DMA2_Stream0, ENABLE);

  /* Configure ADC1 Channe6 pin as analog input ******************************/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* ADC Common Init **********************************************************/
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  ADC_CommonInit(&ADC_CommonInitStructure);

  /* ADC1 Init ****************************************************************/
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfConversion = 2;
  ADC_Init(ADC1, &ADC_InitStructure);

  /* ADC1 regular channe6 configuration *************************************/
  ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_3Cycles);
//  ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 2, ADC_SampleTime_3Cycles);
/* Enable DMA request after last transfer (Single-ADC mode) */
  ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);

  /* Enable ADC1 DMA */
  ADC_DMACmd(ADC1, ENABLE);
        
  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);

}

问题出现了
send函数,如果先发送字符串,再以变量的形式传递进去发送,然后再发送字符串。最后再以变量的形式传递进去发送
就会出现问题
譬如
send(clientfd, "Temperture&AD Value:", sizeof("Temperture&AD Value:"), 0);
send(clientfd, TMP_buff, TMP_str_len, 0);
send(clientfd, "&", sizeof("&"), 0);

send(clientfd, AD_buff, AD_str_len, 0);
send(clientfd, "\r\n", sizeof("\r\n"), 0);

这种排序方式,使得最后2句send(clientfd, AD_buff, AD_str_len, 0);和send(clientfd, "\r\n", sizeof("\r\n"), 0);无法发送。
看上去似乎是进行一次变量传递发送后,只能使用固定字符串形式发送了,再发送变量就没有效果了
很奇怪的一个问题
最后实在没办法,把温度变量、AD变量和固定字符串,用strcat函数全部链接到一个缓存里头,才能正常发送
不知道坛子里面有没有MXCHIP的大牛,求科普。
最后上个视频吧,呵呵



P.S. 代码复制进来, dasdsa.jpg 都变成clientfd+斜体了,需要的同志自行补上吧算不算论坛的bug?@soso
此帖出自RF/无线论坛
So what......


回复

使用道具 举报

3384

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

 楼主| 发表于 2014-11-30 14:45 | 显示全部楼层
庆科的函数库说明比较简略
有朋友手上有比较详细的说明吗
抛一个
So what......


回复

使用道具 举报

49

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2014-12-4 20:55 | 显示全部楼层
回复看看哈  


回复

使用道具 举报

714

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2014-12-10 20:55 | 显示全部楼层
学习学习


回复

使用道具 举报

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

关闭

站长推荐上一条 /7 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-2-27 05:27 , Processed in 0.159137 second(s), 19 queries , Gzip On, MemCache On.

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