STC单片机的硬件SPI问题
各位大侠,这是我的源程序:stc12c5410,硬件SPI,主机程序存在一个问题,就是主机可以对从机发送数据,从机可以接收到;但是,从机返回一个数据给主机,主机接受不到,...
各位大侠,这是我的源程序:stc12c5410,硬件SPI,主机程序
存在一个问题,就是主机可以对从机发送数据,从机可以接收到;
但是,从机返回一个数据给主机,主机接受不到,连中断也没有中断,查询方式也不行,不知为何,请教各位,不胜感激!
#include"stc12c5410ad.h"
#include <string.h>
unsigned char bdata flags;
bit spi_packet ;
void spi_comm_init()
{
SPCTL = 0xFC; // SSIG,SPEN,DORD,MSTR,CPOL,CPHA,SPR1,SPR0。 1110,1100
SPSTAT = 0xC0; //清除中断
AUXR |= 0x08; //允许SPI中断ESPI = 1 0000,1000
EADC_SPI = 1; //IE允许SPI中断 EADC_SPI = 1
}
//向SPI口发送一个字符
void spi_send_comm(unsigned char ch)
{
EADC_SPI = 0; //关掉ADC_SPI共享中断
SPDAT = ch; //发送数据
while(!(SPSTAT & 0x80) ); //等待发送完毕 SPIF = 1
SPSTAT = 0xc0; //清除中断
EADC_SPI = 1; //打开中断
}
//向串口发送一个字符
void send_char_com(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
void adc_spi_interrupt() interrupt 5 //
{
SPSTAT = 0xC0;
bchar = SPDAT;
spi_packet = 1;
}
void init_serialcomm(void)
{ TMOD |= 0x20;
TH1 = 0xF6;
TL1 = 0xB0;
PCON |= 0x80; // SMOD=1
SCON = 0x50;
TR1 = 1; // 启动TR1
}
main()
{ unsigned char uart_data;
init_serialcomm();
spi_comm_init(); //初始化串口
spi_packet=0;
EA = 1;
while(1)
{ if(RI)
{
uart_data=SBUF;
RI=0;
spi_send_comm(uart_data);
send_char_com(uart_data);
}
if(spi_packet) //如果spi数标志已置位,就将读到的数从串口发出
{
spi_packet=0; //取数标志清0
send_char_com(bchar); //从串口发出
}
}
}
这个程序是根据STC给出的汇编测试程序改写成C语言的,我分别改写了主机和从机程序,就出现了以上问题,
但是下载汇编的主机可以跟我改写的从机进行很好的通信
但是改写的主机就是不能收到从机的数据
从机程序几乎和主机一样:
以下是从机的不一样的地方:
void spi_comm_init()
{
SPCTL = 0xEC;
SPSTAT = 0xC0;
AUXR |= 0x08; //允许SPI中断ESPI = 1 0000,1000
EADC_SPI = 1; //IE允许SPI中断 EADC_SPI = 1
}
main()
{ unsigned char uart_data;
init_serialcomm();
spi_comm_init(); //初始化串口
spi_packet=0;
EA = 1;
while(1)
{
if(spi_packet) //如果spi数标志已置位,就将读到的数从串口发出
{
spi_packet=0; //取数标志清0
spi_send_comm(0xBB); //从spi口发出
send_char_com(bchar); //从串口发出
}
}
}
问题已经解决了,呵呵,不过还是谢谢这问仁兄 展开
存在一个问题,就是主机可以对从机发送数据,从机可以接收到;
但是,从机返回一个数据给主机,主机接受不到,连中断也没有中断,查询方式也不行,不知为何,请教各位,不胜感激!
#include"stc12c5410ad.h"
#include <string.h>
unsigned char bdata flags;
bit spi_packet ;
void spi_comm_init()
{
SPCTL = 0xFC; // SSIG,SPEN,DORD,MSTR,CPOL,CPHA,SPR1,SPR0。 1110,1100
SPSTAT = 0xC0; //清除中断
AUXR |= 0x08; //允许SPI中断ESPI = 1 0000,1000
EADC_SPI = 1; //IE允许SPI中断 EADC_SPI = 1
}
//向SPI口发送一个字符
void spi_send_comm(unsigned char ch)
{
EADC_SPI = 0; //关掉ADC_SPI共享中断
SPDAT = ch; //发送数据
while(!(SPSTAT & 0x80) ); //等待发送完毕 SPIF = 1
SPSTAT = 0xc0; //清除中断
EADC_SPI = 1; //打开中断
}
//向串口发送一个字符
void send_char_com(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
void adc_spi_interrupt() interrupt 5 //
{
SPSTAT = 0xC0;
bchar = SPDAT;
spi_packet = 1;
}
void init_serialcomm(void)
{ TMOD |= 0x20;
TH1 = 0xF6;
TL1 = 0xB0;
PCON |= 0x80; // SMOD=1
SCON = 0x50;
TR1 = 1; // 启动TR1
}
main()
{ unsigned char uart_data;
init_serialcomm();
spi_comm_init(); //初始化串口
spi_packet=0;
EA = 1;
while(1)
{ if(RI)
{
uart_data=SBUF;
RI=0;
spi_send_comm(uart_data);
send_char_com(uart_data);
}
if(spi_packet) //如果spi数标志已置位,就将读到的数从串口发出
{
spi_packet=0; //取数标志清0
send_char_com(bchar); //从串口发出
}
}
}
这个程序是根据STC给出的汇编测试程序改写成C语言的,我分别改写了主机和从机程序,就出现了以上问题,
但是下载汇编的主机可以跟我改写的从机进行很好的通信
但是改写的主机就是不能收到从机的数据
从机程序几乎和主机一样:
以下是从机的不一样的地方:
void spi_comm_init()
{
SPCTL = 0xEC;
SPSTAT = 0xC0;
AUXR |= 0x08; //允许SPI中断ESPI = 1 0000,1000
EADC_SPI = 1; //IE允许SPI中断 EADC_SPI = 1
}
main()
{ unsigned char uart_data;
init_serialcomm();
spi_comm_init(); //初始化串口
spi_packet=0;
EA = 1;
while(1)
{
if(spi_packet) //如果spi数标志已置位,就将读到的数从串口发出
{
spi_packet=0; //取数标志清0
spi_send_comm(0xBB); //从spi口发出
send_char_com(bchar); //从串口发出
}
}
}
问题已经解决了,呵呵,不过还是谢谢这问仁兄 展开
1个回答
意法半导体(中国)投资有限公司
2023-08-25
展开全部
意法半导体(中国)投资有限公司
2023-06-12 广告
2023-06-12 广告
STM32F103是一款高性能的嵌入式芯片,由意法半导体(STMicroelectronics)公司生产。它是STM32系列芯片之一,具有紧凑、低功耗、高性能等特点,被广泛应用于嵌入式系统中。STM32F103的主要特点包括:1. 集成了A...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询