你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
举报
simulate_spi.rar
2018-8-14 15:17 上传
点击文件名下载附件
895 Bytes, 下载次数: 87, 下载积分: ST金币 -1
查看全部评分
toofree 发表于 2018-8-10 14:20 不知道你的IO读写是怎么来的。 请参考IO模拟I2C的代码,如下:
select326 发表于 2018-8-10 15:12 这个代码是如何配置IIC的SDA端口方向的??
xiajintaord 发表于 2018-8-10 14:54 感谢回复。 说明一下,我这个是用的 L1 系列,BSRR 寄存器可以分别向 BSRRH、BSRRL 写1进行清零或者置位 ...
dengdenghui 发表于 2018-8-10 15:35 可以问一下啥编辑软件嘛这个配色很舒服
xiajintaord 发表于 2018-8-10 17:25 http://www.sublimetext.com/
00 01工作模式的模拟 SPI 已经调试完成了,都在下面的附件里面;
大家基本上用的都是硬件的 SPI,但有时候受限于成本,硬件资源不足的情况下,像 IIC 一样软件模拟的 SPI 也是一个不错的选择啊。
仅仅是修改部分代码,主要是针对 SCLK 时序,要理解 SPI 在不同的工作模式下的数据收发时序;
simulate_spi.rar
2018-8-14 15:17 上传
点击文件名下载附件
下载积分: ST金币 -1895 Bytes, 下载次数: 87, 下载积分: ST金币 -1
评分
查看全部评分
感谢回复。
说明一下,我这个是用的 L1 系列,BSRR 寄存器可以分别向 BSRRH、BSRRL 写1进行清零或者置位对应的 IO 口,另外,上面工作模式 0 的代码已经测试通过了,说明 IO 配置是 OK 的。
现在的问题是,工作模式 1 的时序没模拟出来,正在用示波器调试,还需要改改程序逻辑
请参考IO模拟I2C的代码,如下:
#define SCL_H GPIOB->BSRR = GPIO_Pin_6
#define SCL_L GPIOB->BRR = GPIO_Pin_6
#define SDA_H GPIOB->BSRR = GPIO_Pin_7
#define SDA_L GPIOB->BRR = GPIO_Pin_7
#define SCL_read GPIOB->IDR & GPIO_Pin_6
#define SDA_read GPIOB->IDR & GPIO_Pin_7
评分
查看全部评分
这个代码是如何配置IIC的SDA端口方向的??
像这种一般都会在程序初始化的时候配置输入输出模式的,这里指关心 IO 的输入输出寄存器的值
不清楚你说的模式0是什么?官方没有这种叫法。
只有master mode、Slave mode、TI mode、BIDIMODE=1、BIDIMODE=0
既然模式0通过,那么模式1也应该能通过的。好好抠一下协议
评分
查看全部评分
http://www.sublimetext.com/
评分
查看全部评分
#include<reg52.h>
//---------------------------------------------------------
#define uchar unsigned char
#define SDA P3_6
#define SCL P3_7
//-----------------------------------------------------------------------
void delay_100us();
void delay_1s();
void i2c_start();
void i2c_stop();
void get_ack();
void i2c_send_byte(uchar mydata);
void i2c_write_byte(uchar dev_addr_wr,uchar word_addr,uchar mydata);
uchar i2c_read_byte(uchar dev_addr_wr,uchar dev_addr2_rd,uchar word_addr);
//------------------------------------------------------------------------
/*void main()
{
uchar temp;
while(1)
{
i2c_write_byte(0xa2,0x00,0x00);
temp=i2c_read_byte(0xa2,0xa3,0x02);
delay_1s();
P1= temp;
}
}*/
//----------------------------------------- //here are the functions
void delay_100us()
{
unsigned char i;
for(i=5;i>0;i--)
{;}
}
//-----------------------------------------
void delay_1s()
{
unsigned char i,j,k;
for(i=100;i>0;i--)
for(j=50;j>0;j--)
for(k=100;k>0;k--)
{;}
}
//------------------------------------------
void i2c_start()
{
SCL=0;
delay_100us();
SDA=1; //a falling edge of sda when scl is high
delay_100us();
SCL=1;
delay_100us();
SDA=0;
delay_100us();
SCL=0; //keep the SDA and SCL low;
delay_100us();
}
//---------------------------------------
void i2c_stop()
{
SCL=0; //a upper edge of sda when scl is high
delay_100us();
SDA=0;
delay_100us();
SCL=1;
delay_100us();
SDA=1;
delay_100us();
SDA=0;
delay_100us();
SCL=0; //keep the SDA and SCL low;
}
//---------------------------------------
void get_ack()
{
do
{
SCL=0;
delay_100us();
SDA=1;
delay_100us();
SCL=1;
delay_100us();
}
while(SDA);
}
//----------------------------------------
void i2c_send_byte(uchar byte)
{
uchar i;
for(i=0;i<8;i++)
{
SCL=0;
delay_100us();
SDA=byte&0x80;
delay_100us();
SCL=1;
delay_100us();
SCL=0;
delay_100us();
byte=byte<<1;
}
get_ack();
}
//----------------------------------------
void i2c_write_byte(uchar dev_addr_wr,uchar word_addr,uchar mydata)
{
i2c_start();
i2c_send_byte(dev_addr_wr);
i2c_send_byte(word_addr);
i2c_send_byte(mydata);
i2c_stop();
}
//----------------------------------------
uchar i2c_read_byte(uchar dev_addr_wr,uchar dev_addr_rd,uchar word_addr)
{
uchar temp,i;
temp=0xff;
//---------------
i2c_start();
i2c_send_byte(dev_addr_wr);
i2c_send_byte(word_addr);
i2c_stop(); //inital the address of device and word
//-------------------------------------------------------------------------
i2c_start();
i2c_send_byte(dev_addr_rd);
for(i=0;i<8;i++)
{
SCL=0;
delay_100us();
SDA=1;
delay_100us();
SCL=1;
delay_100us();
if(SDA)
{
temp|=0x01;
}
else
{
temp&=0xfe;
}
delay_100us();
SCL=0;
delay_100us();
temp=temp<<1;
}
SCL=0;
SDA=1;
SCL=1;
SCL=0; //read data from device
//-----------------------------------------------------------------------
i2c_stop(); //stop the device
return temp;
}
评分
查看全部评分
嗯谢谢你 这个配色对眼睛好
00 01工作模式的模拟 SPI 已经调试完成了,都在下面的附件里面;
大家基本上用的都是硬件的 SPI,但有时候受限于成本,硬件资源不足的情况下,像 IIC 一样软件模拟的 SPI 也是一个不错的选择啊。
仅仅是修改部分代码,主要是针对 SCLK 时序,要理解 SPI 在不同的工作模式下的数据收发时序;