有哪位大神可以讲解一下这个时序图怎么理解?
有哪位大神可以讲解一下这个时序图怎么理解啊,比如这里SCK一会儿高电平,一会儿低怎么对应MOSI,MISO的数据读写啊,还有MOSI对八个数据,MISO又读多少个呢?
INT8U NFC_MISO_Status(void)
{
if(gpio_read_io(NFC_MISO))
return 1;
else
return 0;
}
INT8U NFC_SPI_ReadByte(void)
{
INT8U rByte=0;
INT8U i;
gpio_write_io(NFC_NSS, DATA_LOW);
for(i=0;i<8;i++)
{
gpio_write_io(NFC_SCK, DATA_LOW);
TimerDelayus(2);
rByte<<=1;
if(NFC_MISO_Status())
rByte|=1;
gpio_write_io(NFC_SCK, DATA_HIGH);
TimerDelayus(8);
}
gpio_write_io(NFC_SCK, DATA_LOW);
return rByte;
}
void NFC_SPI_WriteByte(INT8U wByte)
{
INT8U i;
gpio_write_io(NFC_NSS, DATA_LOW);
for(i=0;i<8;i++)
{
gpio_write_io(NFC_SCK, DATA_LOW);
TimerDelayus(8);
if(wByte&0x80)
{
gpio_write_io(NFC_MOSI, DATA_HIGH);
}
else
{
gpio_write_io(NFC_MOSI, DATA_LOW);
}
wByte=wByte<<1;
gpio_write_io(NFC_SCK, DATA_HIGH);
TimerDelayus(2);
}
gpio_write_io(NFC_SCK, DATA_LOW);
//gpio_write_io(NFC_NSS, DATA_HIGH);
}
/*
** function : NFC_AM4K_WriteReg
** return: None
** parameter: (1)INT8U addr--addr
** (2)INT8U value--write value
*/
void NFC_AM4K_WriteReg(INT8U addr, INT8U value)
{
gpio_write_io(NFC_NSS, DATA_LOW); //CS low
NFC_SPI_WriteByte(addr&0x7F); //SPI write addr
NFC_SPI_WriteByte(value); //SPI write data
gpio_write_io(NFC_NSS, DATA_HIGH); //CS high
}
/******************
* * function name:NFC_AM4K_ReadReg
* * return: value - read the register values
* * reference number, addr - register address
* * said: NFC_AM4K register read function
************************************/
INT8U NFC_AM4K_ReadReg(INT8U addr)
{
INT8U value;
gpio_write_io(NFC_NSS, DATA_LOW); //CS low
NFC_SPI_WriteByte(addr|0x80); //SPI write addr
value = NFC_SPI_ReadByte(); //SPI write data
gpio_write_io(NFC_NSS, DATA_HIGH); //CS high
return value;
}
小编你好 你的图片显示有问题 希望你可以用编辑器里的图片工具重新上传哦!
这个小编你的图片挂了
SCK是时钟,当然得高低变化的,MOSI MISO一个是写,一个是读,你看是时钟上升沿有效还是下降沿有效就可以了
SPI时序问题,摆渡可解。
你的图片有问题,我们看不到啊。
没有啊,图片没有什么不对的啊
没有啊,图片没有什么不对的啊
为什么我看得到啊
重发一下图,
你的这个时序图是24L01的时序吧
小编 我帮你将你的图片重新挂在主题帖里了 并推荐了你的问题 希望你可以得到满意的回答
以上是 SPI 读写
自己参考
这个是写函数 把数据value写到addr地址
void NFC_AM4K_WriteReg(INT8U addr, INT8U value)
{
gpio_write_io(NFC_NSS, DATA_LOW); //CS low
NFC_SPI_WriteByte(addr&0x7F); //SPI write addr
NFC_SPI_WriteByte(value); //SPI write data
gpio_write_io(NFC_NSS, DATA_HIGH); //CS high
}
/******************
* * function name:NFC_AM4K_ReadReg
* * return: value - read the register values
* * reference number, addr - register address
* * said: NFC_AM4K register read function
************************************/
这是读函数 从地址addr里读取
INT8U NFC_AM4K_ReadReg(INT8U addr)
{
INT8U value;
gpio_write_io(NFC_NSS, DATA_LOW); //CS low
NFC_SPI_WriteByte(addr|0x80); //SPI write addr
value = NFC_SPI_ReadByte(); //SPI write data
gpio_write_io(NFC_NSS, DATA_HIGH); //CS high
return value;
}
你应该还不会看时序图吧,你可以百度一下时序图,百度百科讲得很明白。
这是一个flash的时序图,我们读取时序图的时候要遵循,从上到下,从左到右,最上面的csn代表控制端,类似于cs端,低电平有效,再下来sck是时钟,然后mosi和moso,一个是命令地址等,一个是发送数据。接着我们从左到右,csn为低电平有效,然后时钟也有效,mosi发送一段地址或者命令,miso发送了一段数据。然后自己按照楼上给的程序一步步看吧
以上是 SPI 读写
时序是从左往右读的,图中的意思的,CSN拉低后开始进行SPI的操作,SPI读取数据是先需要向从设备发送一个字节的读取指令(暂时这么叫吧),即图中的MOSI部分的前八个脉冲(图中描述为C0~C7),此时MISO为(S0~S7)随机状态,然后从设备向主设备发送两个字节,低字节在前。上述中,发送和接收都需要有时钟脉冲的,也就是图中的CLK部分。数据帧结束后,CSN拉高,表示当前数据帧发送或者接收完成了。
非常感谢谢
在CSN片选选中后(低电平)后,先发数据,后拉高时钟,此时的数据有效。简单来说就是在sck时钟上升沿时,数据线上的数据才有效。