首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]S12DG128的SPI问题

[求助]S12DG128的SPI问题

大家好!刚学S12,想弄通SPI,我用2个S12DG128,一主一从,主/SS接Vcc,从/SS接地,写了下面2个小程序,让master发slave收,收到后用串口传到PC,可总调不通,slave程序总是停在while(!(SPI0SR_SPIF))这一步,好像数据根本没有在主从之间移位,问题在哪呢?
for master:
void ini_master(void) {
SPI0CR1_SPE=1;
SPI0CR1_MSTR=1;
SPI0CR1_CPHA=1;
SPI0CR2=0x00;
SPI0BR=0x03;
}
void main(void) {
ini_master();
for(;;) {
while(!(SPI0SR_SPTEF));
SPI0DR='A';
}
}
for slave:
void ini_slave(void) {
SPI0CR1_SPE=1;
SPI0CR1_CPHA=1;
SPI0CR2=0x00;
SPI0BR=0x03;
}
void ini_sci0(void) {
SCI0BD=52;
SCI0CR1=0x00;
SCI0CR2=0x0c;
}
void tx_sci0(char i){
while(SCI0SR1_TDRE!=1);
SCI0DRL=i;
}
void main(void) {
char temp;
ini_sci0();
ini_slave();
for(;;) {
while(!(SPI0SR_SPIF));
temp=SPI0DR;
tx_sci0(temp);
}
}

前不见古人,后不见来者。 念天地之悠悠,独怆然而涕下。
我不知道SS按上面接法对不对。
我根据
http://bbs.eccn.com/dispbbs.asp?boardid=3&rootid=118351&id=118351&star=
所述重新写了master程序如下:
#include /* common defines and macros */
#include /* derivative information */


#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
/************ @ INI_SCI ********************/
void ini_sci(void) {
SCI0BD=52;
SCI0CR1=0x00;
SCI0CR2=0x0c;
}
/************ @@ TX_SCI ******************/
void tx_sci(char i){
while(SCI0SR1_TC!=1);
SCI0DRL=i;
}
/************* @@@ INI_SPI *********************/
void ini_spi(void){
SPI0BR=0b01110111; //clock divisor is 2
SPI0CR2=0b00000010;// SS is not used(in master mode ,MODFEN=0)
SPI0CR1=0b01010000;// as master

}
/*************** @@@@ SPI_WRITE *****************/
void putchar_spi0 (char cx)
{ unsigned char temp;
while(!(SPI0SR_SPTEF)); /* wait until write is permissible */
SPI0DR = cx; /* output the byte to the SPI */
while(!(SPI0SR_SPIF)); /* wait until write operation is complete */
// temp=SPI0SR;
temp=SPI0DR; // clear the spif flag.
}
/************** @@@@@ SPI_READ *******************/
char getchar_spi0(void)
{
unsigned char te;
while(!(SPI0SR_SPTEF)); /* wait until write is permissible */
SPI0DR = 0x61; /* trigger 8 SCK pulses to shift in data */
while(!(SPI0SR_SPIF)); /* wait until a byte has been shifted in */
// te=SPI0SR;
te=SPI0DR; // clear the spif flag.
return te; /* return the character */
}
/**************** @@@@@@DELAY ********************/
void delay (unsigned char i){
word temp;
for(;i>0;i--){
for(temp=0;temp<1000;)temp++;

}
}
/////////////////########*** MAIN ***###########/////////////////
void main(){
char i,time[3];
ini_sci();
ini_spi();
//DDRS_DDRS6=1;
DDRS_DDRS3=1;
MODRR_MODRR4=1;

for(;;){
putchar_spi0(1); // send the data one byte (test value 1).
time[0]=getchar_spi0(); // receive 3 bytes.
time[1]=getchar_spi0();
time[2]=getchar_spi0();

PTS_PTS3=~PTS_PTS3;
delay(20);
//time[3]=PTS;
for(i=0;i<3;i++)
tx_sci(time);
}
}
结果master的MOSI端输出波形正确,MISO也能将信号采进来,但是sck无输出,始终低电平,两mcu无法通信,master收到的全是FF。如果断掉slave,将master的MOSI和MISO连接起来则可以收到getchar函数里为了读数而发送的61,所以master里SPI移位时钟是好的,但SCK究竟为什么无法输出呢?
slave的程序如下:
#include /* common defines and macros */
#include /* derivative information */


#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

/************* @ INI_SPI *********************/
void ini_spi(void){
SPI0BR=0b01110111; //clock divisor is 2
SPI0CR2=0b00000010;// SS is input
SPI0CR1=0b01000000;// as slave
}
/*************** @@ SPI_WRITE *****************/
void putchar_spi0 (char cx)
{ unsigned char temp;
while(!(SPI0SR_SPTEF)); /* wait until write is permissible */
SPI0DR = cx; /* output the byte to the SPI */
while(!(SPI0SR_SPIF)); /* wait until write operation is complete */
// temp=SPI0SR;
temp=SPI0DR; // clear the spif flag.
}
/************** @@@ SPI_READ *******************/
char getchar_spi0(void)
{
unsigned char te;
while(!(SPI0SR_SPTEF)); /* wait until write is permissible */
SPI0DR = 0x00; /* trigger 8 SCK pulses to shift in data */
while(!(SPI0SR_SPIF)); /* wait until a byte has been shifted in */
// te=SPI0SR;
te=SPI0DR; // clear the spif flag.
return te; /* return the character */
}
/////////////////########*** MAIN ***###########/////////////////
void main(){
char test;
ini_spi();
for(;;){

test=getchar_spi0();
if(test==1){
putchar_spi0(222);
putchar_spi0(111);
putchar_spi0(123);
}
}
}
前不见古人,后不见来者。 念天地之悠悠,独怆然而涕下。
如果MCU的SPI模块工作正常的话,MOSI和SCK引脚上必定同时会有信号输出,不会出现SCK上没有信号的情况。仔细检查一下硬件连接吧。如果可能,换一块芯片试试。
海纳百川  有容乃大
谢谢版主!果然硬件有问题,slave MCU的SPI0模块坏了,换成SPI1就可以了。
前不见古人,后不见来者。 念天地之悠悠,独怆然而涕下。
我根据这个程序调了主从机的SPI 通信,但是从机收到的数都是主机发送的数据除以2,从示波器上看MOSI引脚上发出来的数都是对的,怀疑是CPHA和CPOL位的设定问题,斑竹能不能帮忙看看
那应该是相位设置的问题。你可以改一下然后看看效果。
海纳百川  有容乃大

把CPOL都设为1尽然就可以了,这为是决定SCK空闲时的高低电平,从机接受是上升沿采样还是下降沿采样呢

这些在数据手册中都有详尽的说明。

海纳百川  有容乃大
返回列表