共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 跳转至页
回复
打赏帖 | |
---|---|
C语言函数宏的三种封装方式被打赏50分 | |
【STM32F769】记一次由于开启D-Cache之后DMA数据传输出错的问题查找与解决被打赏35分 | |
嵌入式LinuxC语言程序调试和宏使用技巧被打赏50分 | |
让代码中包含最新的编译时间信息被打赏50分 | |
【分享开发笔记,赚取电动螺丝刀】STM32F769LVGL优化显示被打赏26分 | |
rtthread硬件加密--2crc加密分析被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】STM32F769驱动ST7789以及显示优化被打赏36分 | |
【分享开发笔记,赚取电动螺丝刀】S32K146 PAL模拟I2C驱动适配被打赏23分 | |
我想要一部加热台+电源硬件设计规范被打赏16分 | |
我想要一部加热台+LED背光驱动芯片RT9293知识被打赏18分 |