标题:
AVR mega16单片机MCP2510发送程序可行,接收不可行请高手指教。
[打印本页]
作者:
active12
时间:
2019-3-23 12:37
标题:
AVR mega16单片机MCP2510发送程序可行,接收不可行请高手指教。
如下代码部分只能发送,不能接收,还请高手指点。
void Spi_MasterTransmit(void)
{
#if 1
char i;
//是为了等待串行数据发送,发送结束前始终在循环,结束后跳出循环,执行后续代码。
if (SpiSending!=0)//有数据需要发送
{
if (McpFisrtCmm==0)//第1次发送
{
CLRCS;//SPI口基本在PB口 开启
NOP();
NOP();
SPDR = SpiTransData[0];
SpiSendNum=1;//指向下一地址
McpFisrtCmm=1;
}
else
{
if (SPSR & (1<<SPIF))//串行发送结束后,SPIF置位,中断//是为了等待串行数据发送,发送结束前始终在循环,结束后跳出循环,执行后续代码。
{
if(SpiSendNum<SpiMaxSend)//SpiMaxSend应比量小1 ,SpiMaxSend = 5
{
SpiReceiveData[SpiSendNum-1]=SPDR;//读数据
SPDR = SpiTransData[SpiSendNum];//写数据
SpiSendNum++; //下一笔数据
//SpiRcvNum = 0;//读的时候写的数据笔数为0
}
else
{
SpiReceiveData[SpiSendNum-1]=SPDR;//读数据 //SpiSendNum 需要一个初始值才行。
// SpiReceiveData1[SpiRcvNum++]=SPDR;
//相应指示
SpiMaxSend=0;//传输完成
SpiSending=0;
McpFisrtCmm=0;//清除标示
SETCS;//停止数据发送
}
}
}
}else
{
CLRCS;//SPI口基本在PB口 开启
if ((SPSR & (1<<SPIF)))//串行发送结束后,SPIF置位,中断//是为了等待串行数据发送,发送结束前始终在循环,结束后跳出循环,执行后续代码。
{
//Set_Bit(PORTB, 3);
ImitShootFlag = 1;
//SPDR = 0XFF;
MCP2510Read(RXB0DLC,20);
for(i=0;i< 20;i++)
SpiReceiveData1[i]=SpiTransData[i];//SPDR;
// if(SpiRcvNum > 20)
// SpiRcvNum = 0;
}
SETCS;//停止数据发送
}
#endif
#if 0
//是为了等待串行数据发送,发送结束前始终在循环,结束后跳出循环,执行后续代码。
if (SpiSending!=0)//有数据需要发送
{
if (McpFisrtCmm==0)//第1次发送
{
CLRCS;//SPI口基本在PB口 开启
NOP();
NOP();
SPDR = SpiTransData[0];
SpiSendNum=1;//指向下一地址
McpFisrtCmm=1;
}
else
{
// 对 SPI 数据寄存器写入数据即启动SPI 时钟,将8 比特的数据移入从机。
if (SPSR & (1<<SPIF))//串行发送结束后,SPIF置位,中断//是为了等待串行数据发送,发送结束前始终在循环,结束后跳出循环,执行后续代码。
{
if(SpiSendNum<SpiMaxSend)//SpiMaxSend应比量小1 ,SpiMaxSend = 5
{
ImitShootFlag = 1;
// SpiReceiveData[SpiSendNum++]=SPDR;//test
SpiReceiveData[SpiSendNum-1]=SPDR;//读数据 //应该去掉wanwan //一去掉,SPI就不能初始化
SPDR = SpiTransData[SpiSendNum];//写数据
SpiSendNum++; //下一笔数据
SpiRcvNum = 0;//读的时候写的数据笔数为0
}
else
{
////////////////////////////////////////////////////////////
SETCS;//停止数据发送
// NOP();
// SPCR = (1<<SPE) | (0<<MSTR) | (1<<SPR0);//清零SPCR 的MSTR 位,使SPI 成为从机
// NOP();
SpiReceiveData[SpiSendNum-1]=SPDR;//读数据 //SpiSendNum 需要一个初始值才行。wanwan
// SpiReceiveData1[SpiRcvNum++]=SPDR;
// SpiReceiveData[SpiSendNum++]=SPDR;//读数据 //SpiSendNum 需要一个初始值才行。wanwan
// SpiReceiveData[SpiSendNum++]=0x55;//test
//相应指示
SpiMaxSend=0;//传输完成
SpiSending=0;
McpFisrtCmm=0;//清除标示
}
}
}
}else
{
//SETCS;//停止数据发送
//DDR_SPI = (1<<DD_MISO);
if (!(SPSR & (1<<SPIF)))//串行发送结束后,SPIF置位,中断//是为了等待串行数据发送,发送结束前始终在循环,结束后跳出循环,执行后续代码。
{
//Set_Bit(PORTB, 3);
ImitShootFlag = 1;
SPDR = 0XFF;
SpiReceiveData1[SpiRcvNum++]=SPDR;
if(SpiRcvNum > 20)
SpiRcvNum = 0;
}
}
#endif
#if 0
//SPDR = cData;//启动数据传输
//while(!(SPSR&(1<<SPIF)));//等待传输结束,SPSR&(1<<SPIF)即1,循环内
//是为了等待串行数据发送,发送结束前始终在循环,结束后跳出循环,执行后续代码。
if (SpiSending!=0)//有数据需要发送
{
if (McpFisrtCmm==0)//第1次发送
{
CLRCS;//SPI口基本在PB口 开启
NOP();
NOP();
SPDR = SpiTransData[0];
SpiSendNum=1;//指向下一地址
McpFisrtCmm=1;
}
else
{
// 对 SPI 数据寄存器写入数据即启动SPI 时钟,将8 比特的数据移入从机。
if (SPSR & (1<<SPIF))//串行发送结束后,SPIF置位,中断//是为了等待串行数据发送,发送结束前始终在循环,结束后跳出循环,执行后续代码。
{
if(SpiSendNum<SpiMaxSend)//SpiMaxSend应比量小1 ,SpiMaxSend = 5
{
// CLRCS;//数据发送
// NOP();
// SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0);
// NOP();
// SpiReceiveData[SpiSendNum++]=SPDR;//test
SpiReceiveData[SpiSendNum-1]=SPDR;//读数据 //应该去掉wanwan //一去掉,SPI就不能初始化
SPDR = SpiTransData[SpiSendNum];//写数据
SpiSendNum++; //下一笔数据
SpiRcvNum = 0;//读的时候写的数据笔数为0
}
else
{
////////////////////////////////////////////////////////////
SETCS;//停止数据发送
// NOP();
// SPCR = (1<<SPE) | (0<<MSTR) | (1<<SPR0);//清零SPCR 的MSTR 位,使SPI 成为从机
// NOP();
SpiReceiveData[SpiSendNum-1]=SPDR;//读数据 //SpiSendNum 需要一个初始值才行。wanwan
// SpiReceiveData1[SpiRcvNum++]=SPDR;
// SpiReceiveData[SpiSendNum++]=SPDR;//读数据 //SpiSendNum 需要一个初始值才行。wanwan
// SpiReceiveData[SpiSendNum++]=0x55;//test
//相应指示
SpiMaxSend=0;//传输完成
SpiSending=0;
McpFisrtCmm=0;//清除标示
}
}
}
}
#endif
// SETCS;//停止数据发送
// NOP();
// SPCR = (1<<SPE) | (0<<MSTR) | (1<<SPR0);//清零SPCR 的MSTR 位,使SPI 成为从机
// NOP();
// if (SPSR & (1<<SPIF))//串行发送结束后,SPIF置位,中断//是为了等待串行数据发送,发送结束前始终在循环,结束后跳出循环,执行后续代码。
// {
// SpiReceiveData1[SpiRcvNum++]=SPDR;
// if(SpiRcvNum > 5)
// SpiRcvNum = 0;
//
// }
}
复制代码
AVR mega16 MCP2510发送程序.rar
2019-3-23 12:37 上传
点击文件名下载附件
444.47 KB, 下载次数: 7
作者:
yzwzfyz
时间:
2019-3-24 08:22
再细读2510手册。
作者:
yzwzfyz
时间:
2019-3-24 08:25
要点1:是弄清楚,它的128个寄存器作用分别是什么?
要点2:如何时正确的配制通讯波特率。
作者:
active12
时间:
2019-3-30 11:55
谢谢。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1