4895|6

9

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM8S103F3P6+cc1101透传 串口接收中断程序无法运行,急 ... [复制链接]

10芯积分


向各位高手求助,已经做了两天多了还没搞定。新手上路
采用stm8s103f3p6单片机,连接cc1101透传(接vcc gnd txd rxd就行)无线通信模块,向连接虚拟串口usb的pc调试助手收发数据。
板子是单独供电,还需要一个USART转USB接口下载程序。有图


搜狗截图20180415140805.png (34.89 KB, 下载次数: 0)
下载附件  保存到相册
12 分钟前 上传





试了一下,串口调试助手可以通过ST-LINK V2发送数据给单片机(LCD1602有显示),但是通过虚拟串口USB向cc1101发送数据,就接收不到。想请教一下什么问题。代码如下:


#include
#define uint unsigned int //定义常用数据类型替代码
#define uchar unsigned char
#define CLR_RS PA_ODR_bit.ODR1 = 0
#define SET_RS PA_ODR_bit.ODR1 = 1
#define CLR_EN PA_ODR_bit.ODR2 = 0
#define SET_EN PA_ODR_bit.ODR2 = 1

/******定义函数****************/
void Delay(uint ms); //延时程序
void LCD_init(void); //液晶初始化
void LCD_write_command(uchar command); //液晶写数据程序
void LCD_clear(void);//清屏
void LCD_write_data(uchar dat); //液晶写指令程序
void LCD_set_xy (uchar x, uchar y);//位置
void display(void); //显示程序

void Delay(unsigned int ms)
{
   unsigned int x,y;
   for(x=ms;x>0;x--)
     for(y=1600;y>0;y--);
}
void LCD_clear(void)
{
   LCD_write_command(0x01);//清除屏幕显示
  Delay(5);
}
void  LCD_init(void)
{
LCD_write_command(0x38);//设置8位格式,2行,5x7
LCD_write_command(0x0c);//整体显示,关光标,不闪烁
LCD_write_command(0x06);//设定输入方式,增量不移位
LCD_write_command(0x01);//清除屏幕显示
Delay(5);//
}
//写指令函数——写地址
void LCD_write_command(uchar command)
{
CLR_EN;
//CLR_RW;
CLR_RS;
PD_ODR=(command<<1);
PC_ODR=command;
SET_EN;
CLR_EN;
Delay(5);//
}
//写数据函数
void LCD_write_data(uchar dat)
{
CLR_EN;
//CLR_RW;
SET_RS;
PD_ODR=(dat<<1);
PC_ODR=dat;
SET_EN;
CLR_EN;
Delay(5);
}
void LCD_set_xy( uchar x, uchar y )//写位置程序
{
    uchar address;
    if (y == 0) address = 0x80 + x;
    else address = 0xc0 + x;
    LCD_write_command( address);
}
void LCD_print(char *str)
{
   while(*str)
   {
     LCD_write_data(*str);
     Delay(5);
     str++;
   }
}

/*******************************************************************************
**函数名称:void UART1_Init(unsigned int baudrate)
**功能描述:初始化USART模块
**入口参数:unsigned int baudrate  -> 设置串口波特率
**输出:无
*******************************************************************************/
void UART1_Init(unsigned long baudrate)
{   
   unsigned int baud;              //
   
   baud = 16000000 / baudrate;     //设定串口相应波特率与串口时钟的分频数
  
   //先写BRR2 , 再写BRR1
   UART1_BRR2 = ((unsigned char)((baud & 0xf000) >> 8 )) | ((unsigned char)(baud & 0x000f));       //先写波特比率的高4位与低4位
  UART1_BRR1 =  ((unsigned char)((baud & 0x0ff0) >> 4));                                          //后写波特比率的中间8位
  
   UART1_CR1_bit.UART0 = 0;        //使能UART0
   UART1_CR2_bit.RIEN = 1;         //使能中断接收
  UART1_CR2_bit.TEN = 1;          //使能发送
  UART1_CR2_bit.REN = 1;          //接收使能
}
/*******************************************************************************
**函数名称:void Uart_SendData(unsigned char  data)
**功能描述:向串口发送寄存器写入一个字节数据
**入口参数:unsigned char  data
**输出:无
*******************************************************************************/
void Uart_SendData(unsigned char  data)
{
   while(!(UART1_SR&0X80));        //判断发送数据寄存器是否为空
  UART1_DR = data;                //向发送寄存器写入数据  
}
/*******************************************************************************
**函数名称:void Uart_SendString(unsigned char *data , unsigned char strlen)
**功能描述:向串口连续发送多个字符
**入口参数: char *data
**输出:无
*******************************************************************************/
void Uart_SendString( char *data)
{

   while(*data)
   {
     Uart_SendData(*data++);
   }
}
void CLKInit()
{
   CLK_CKDIVR = 0x00;                  //内部高速时钟16MHZ 进行1分频
  CLK_ICKR_bit.LSIEN = 1;             // 打开芯片内部的低速振荡器LSI
   while(CLK_ICKR_bit.LSIRDY == 0);    // 等待振荡器稳定
}

int main(void)
{
   PD_DDR |= 0x0E;//PD1-3设置为输出模式0x1E
   PD_CR1 |= 0x0E;
   PD_CR2 |= 0x0E;
   PC_DDR |= 0xF8;//PC3-7设置为输出模式0xF0
   PC_CR1 |= 0xF8;
   PC_CR2 |= 0xF8;
   PA_DDR |= 0x06;//PA1,PA2设置为输出模式0x06
   PA_CR1 |= 0x06;
   PA_CR2 |= 0x06;
     
   asm("sim");              //关总中断
  CLKInit();
   UART1_Init(4800);
   LCD_clear();
   LCD_init();
   asm("rim");              //打开系统总中断
while(1)
{  
   ;
}
}
/*    串口接收数据中断服务函数    */
#pragma vector = 0x14              //设置串口接收中断向量号 = 0X14
__interrupt void UART1_RX_RXNE(void)
{         
   unsigned char ch1;
   UART1_SR_bit.RXNE  = 0;    //清除中断标志
//     if(UART1_SR&UART1_SR_bit.OR_LHE)
//     { UART1_SR &=(~UART1_SR_bit.OR_LHE);
//     }
     ch1 = UART1_DR;       //读出串口接收到的数据
//   Uart_SendData(ch1);   //把接收到的数据再通过串口发送出去
    LCD_set_xy(0,0);
     LCD_write_data(ch1);
}

求救求救!!!!

此帖出自stm32/stm8论坛

最新回复

是·,你那个模块实不了解  详情 回复 发表于 2018-4-15 23:00
点赞 关注
 

回复
举报

4008

帖子

0

TA的资源

版主

沙发
 
CC1101是spi接口,你那个是硬件是咋回事就不了解了。
此帖出自stm32/stm8论坛
 
 

回复

9

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
huo_hu 发表于 2018-4-15 18:56
CC1101是spi接口,你那个是硬件是咋回事就不了解了。

我用的是一种只需要写串口收发程序的cc1101模块,相当于把有线串口编程无线那种
此帖出自stm32/stm8论坛
 
 

回复

4008

帖子

0

TA的资源

版主

4
 
cc1101是单工芯片,你收发转换怎么实现的?
此帖出自stm32/stm8论坛
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(初级)

5
 
huo_hu 发表于 2018-4-15 21:08
cc1101是单工芯片,你收发转换怎么实现的?

网上说好像是半双工的,不同一时刻收发就可以了
此帖出自stm32/stm8论坛
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(初级)

6
 
huo_hu 发表于 2018-4-15 21:08
cc1101是单工芯片,你收发转换怎么实现的?

网上说好像是半双工的,不同一时刻收发就可以了
此帖出自stm32/stm8论坛

点评

是·,你那个模块实不了解  详情 回复 发表于 2018-4-15 23:00
 
 
 

回复

4008

帖子

0

TA的资源

版主

7
 
顾念深笙 发表于 2018-4-15 22:30
网上说好像是半双工的,不同一时刻收发就可以了

是·,你那个模块实不了解
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表