共4条
1/1 1 跳转至页
STC12C2052,SPI STC12C2052的SPI接口问题请教
问
大家好:
我用2052的SPI接口,访问HC595是好的,说明SPI接口没坏,至少可以工作.595输出对的.
现在我用同样的设置来访问一个SPI接口芯片,MCP2515,我编写的读写函数都是对的(改造的,原来在AVR单片机那里用的,都是好好的).现在就是写个数到2515,然后读出来,竟然都不对的,不知道为什么啊?
sbit SCLK = P1^7;
sbit MISO = P1^6;
sbit MOSI = P1^5;
sbit SS = P1^4;
/*SPI初始化*/
void init_SPI (void)
{ P1M0=0x40; //0b01000000;
P1M1=0xb0; //0b10110000;
//P1.6为输入,P1.7,P1.5,P1.4为推挽输出
SPCTL=0xD0;
//SSIG=1;忽略SS脚
//SPEN=1;允许SPI工作
//DORD=0;先传高位MSB
//MSTR=1;设为主机
//CPOL=0,CPHA=0;
//SPR1,SPR0=00;主模式时SPI时钟源选择为fosc/4
}
/*MCP2515写操作*/
void write_MCP (unsigned char adress, unsigned char value)
{
SS=0; // CS Low -> MCP enable
SPDAT=0x02; // sende Write Kommando
while(!(SPSTAT & (1<<SPIF))); // warten bis das Byte gesendet wurde
SPDAT=adress; // Addresse senden
while(!(SPSTAT & (1<<SPIF))); // warten bis das Byte gesendet wurde
SPDAT=value; // Wert senden
while(!(SPSTAT & (1<<SPIF))); // warten bis das Byte gesendet wurde
SS=1; // CS High -> MCP disable
}
/*MCP2515读操作*/
unsigned char read_MCP(unsigned char adress)
{
unsigned char spidata;
SS=0; // CS Low -> MCP enable
SPDAT=0x03; // sende Read Kommando
while(!(SPSTAT & (1<<SPIF))); // warten bis das Byte gesendet wurde
SPDAT=adress; // Adresse von der gelesen werden soll
while(!(SPSTAT & (1<<SPIF))); // warten bis das Byte gesendet wurde
SPDAT=0xAA; // Dummy-Byte senden
while(!(SPSTAT & (1<<SPIF))); // warten bis das Byte gesendet wurde
spidata = SPDAT; // Daten aus SPI abholen
SS=1; // CS High -> MCP disable
return (spidata); 答 1: 1 现在写了测试程序,就写数到一个寄存器,然后读出来,但就是不对啊?
P3L=0; //指示灯亮
write_MCP (CNF1, 0x03);
while(read_MCP(CNF1)!=0x03)
{write_MCP (CNF1, 0x03);}
P3L=1;
请大家帮忙啊,谢谢了. 答 2: 2052 的SPI功能是不是不好用的啊 答 3: 姚工帮忙啊 答 4: 我用2052的SPI接口,访问HC595是好的我用2052的SPI接口,访问HC595是好的,说明SPI接口没坏,至少可以工作.595输出对的 答 5: RE stcmcu:
你好.我用595做是好的,595只要输出就好了,不用读数据回来,现在的SPI从器件需要读数据回来的.
昨天我用SPI的几个I/O口模拟SPI时序已经实现访问MCP2515了.模拟的时序和这里的读写函数一样.但真正的SPI功能还是不行啊,不知道为什么??????
我就是简单的要写一个数到MCP2515的寄存器中,然后读出来,看对不对,但好象就是读不对的样子.这2个读写函数肯定没错了,在AVR+MCP2515那边用过的.
所以只能怀疑STC的SPI功能了啊,主要我有个朋友也是这个问题啊,试不出来STC的SPI功能.
答 6: 已经找到原因并解决了原来STC的SPI有点特殊啊,没仔细看资料
我用2052的SPI接口,访问HC595是好的,说明SPI接口没坏,至少可以工作.595输出对的.
现在我用同样的设置来访问一个SPI接口芯片,MCP2515,我编写的读写函数都是对的(改造的,原来在AVR单片机那里用的,都是好好的).现在就是写个数到2515,然后读出来,竟然都不对的,不知道为什么啊?
sbit SCLK = P1^7;
sbit MISO = P1^6;
sbit MOSI = P1^5;
sbit SS = P1^4;
/*SPI初始化*/
void init_SPI (void)
{ P1M0=0x40; //0b01000000;
P1M1=0xb0; //0b10110000;
//P1.6为输入,P1.7,P1.5,P1.4为推挽输出
SPCTL=0xD0;
//SSIG=1;忽略SS脚
//SPEN=1;允许SPI工作
//DORD=0;先传高位MSB
//MSTR=1;设为主机
//CPOL=0,CPHA=0;
//SPR1,SPR0=00;主模式时SPI时钟源选择为fosc/4
}
/*MCP2515写操作*/
void write_MCP (unsigned char adress, unsigned char value)
{
SS=0; // CS Low -> MCP enable
SPDAT=0x02; // sende Write Kommando
while(!(SPSTAT & (1<<SPIF))); // warten bis das Byte gesendet wurde
SPDAT=adress; // Addresse senden
while(!(SPSTAT & (1<<SPIF))); // warten bis das Byte gesendet wurde
SPDAT=value; // Wert senden
while(!(SPSTAT & (1<<SPIF))); // warten bis das Byte gesendet wurde
SS=1; // CS High -> MCP disable
}
/*MCP2515读操作*/
unsigned char read_MCP(unsigned char adress)
{
unsigned char spidata;
SS=0; // CS Low -> MCP enable
SPDAT=0x03; // sende Read Kommando
while(!(SPSTAT & (1<<SPIF))); // warten bis das Byte gesendet wurde
SPDAT=adress; // Adresse von der gelesen werden soll
while(!(SPSTAT & (1<<SPIF))); // warten bis das Byte gesendet wurde
SPDAT=0xAA; // Dummy-Byte senden
while(!(SPSTAT & (1<<SPIF))); // warten bis das Byte gesendet wurde
spidata = SPDAT; // Daten aus SPI abholen
SS=1; // CS High -> MCP disable
return (spidata); 答 1: 1 现在写了测试程序,就写数到一个寄存器,然后读出来,但就是不对啊?
P3L=0; //指示灯亮
write_MCP (CNF1, 0x03);
while(read_MCP(CNF1)!=0x03)
{write_MCP (CNF1, 0x03);}
P3L=1;
请大家帮忙啊,谢谢了. 答 2: 2052 的SPI功能是不是不好用的啊 答 3: 姚工帮忙啊 答 4: 我用2052的SPI接口,访问HC595是好的我用2052的SPI接口,访问HC595是好的,说明SPI接口没坏,至少可以工作.595输出对的 答 5: RE stcmcu:
你好.我用595做是好的,595只要输出就好了,不用读数据回来,现在的SPI从器件需要读数据回来的.
昨天我用SPI的几个I/O口模拟SPI时序已经实现访问MCP2515了.模拟的时序和这里的读写函数一样.但真正的SPI功能还是不行啊,不知道为什么??????
我就是简单的要写一个数到MCP2515的寄存器中,然后读出来,看对不对,但好象就是读不对的样子.这2个读写函数肯定没错了,在AVR+MCP2515那边用过的.
所以只能怀疑STC的SPI功能了啊,主要我有个朋友也是这个问题啊,试不出来STC的SPI功能.
答 6: 已经找到原因并解决了原来STC的SPI有点特殊啊,没仔细看资料
共4条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |