接口时序4SPI总线的原理与Verilog实现jgliu

1、FPGA型号:Xilinx公司的XC6SLX45-2CSG324

2、Flash型号:WinBond公司的W25Q128BVQualSPIFlash存储器

二、原理介绍

SPI(SerialPeripheralInterface,串行外围设备接口),是Motorola公司提出的一种同步串行接口技术,是一种高速、全双工、同步通信总线,在芯片中只占用四根管脚用来控制及数据传输,广泛用于EEPROM、Flash、RTC(实时时钟)、ADC(数模转换器)、DSP(数字信号处理器)以及数字信号解码器上。SPI通信的速度很容易达到好几兆bps,所以可以用SPI总线传输一些未压缩的音频以及压缩的视频。

下图是只有2个chip利用SPI总线进行通信的结构图

可知SPI总线传输只需要4根线就能完成,这四根线的作用分别如下:

SCK(SerialClock):SCK是串行时钟线,作用是Master向Slave传输时钟信号,控制数据交换的时机和速率;

MOSI(MasterOutSlavein):在SPIMaster上也被称为Tx-channel,作用是SPI主机给SPI从机发送数据;

CS/SS(ChipSelect/SlaveSelect):作用是SPIMaster选择与哪一个SPISlave通信,低电平表示从机被选中(低电平有效);

MISO(MasterInSlaveOut):在SPIMaster上也被称为Rx-channel,作用是SPI主机接收SPI从机传输过来的数据;

SPI总线主要有以下几个特点:

1、采用主从模式(Master-Slave)的控制方式,支持单Master多Slave。SPI规定了两个SPI设备之间通信必须由主设备Master来控制从设备Slave。也就是说,如果FPGA是主机的情况下,不管是FPGA给芯片发送数据还是从芯片中接收数据,写Verilog逻辑的时候片选信号CS与串行时钟信号SCK必须由FPGA来产生。同时一个Master可以设置多个片选(ChipSelect)来控制多个Slave。SPI协议还规定Slave设备的clock由Master通过SCK管脚提供给Slave,Slave本身不能产生或控制clock,没有clock则Slave不能正常工作。单Master多Slave的典型结构如下图所示

2、SPI总线在传输数据的同时也传输了时钟信号,所以SPI协议是一种同步(Synchronous)传输协议。Master会根据将要交换的数据产生相应的时钟脉冲,组成时钟信号,时钟信号通过时钟极性(CPOL)和时钟相位(CPHA)控制两个SPI设备何时交换数据以及何时对接收数据进行采样,保证数据在两个设备之间是同步传输的。

3、SPI总线协议是一种全双工的串行通信协议,数据传输时高位在前,低位在后。SPI协议规定一个SPI设备不能在数据通信过程中仅仅充当一个发送者(Transmitter)或者接受者(Receiver)。在片选信号CS为0的情况下,每个clock周期内,SPI设备都会发送并接收1bit数据,相当于有1bit数据被交换了。数据传输高位在前,低位在后(MSBfirst)。SPI主从结构内部数据传输示意图如下图所示

SPI总线传输的模式:

SPI总线传输一共有4中模式,这4种模式分别由时钟极性(CPOL,ClockPolarity)和时钟相位(CPHA,ClockPhase)来定义,其中CPOL参数规定了SCK时钟信号空闲状态的电平,CPHA规定了数据是在SCK时钟的上升沿被采样还是下降沿被采样。这四种模式的时序图如下图所示:

模式0:CPOL=0,CPHA=0。SCK串行时钟线空闲是为低电平,数据在SCK时钟的上升沿被采样,数据在SCK时钟的下降沿切换

模式1:CPOL=0,CPHA=1。SCK串行时钟线空闲是为低电平,数据在SCK时钟的下降沿被采样,数据在SCK时钟的上升沿切换

模式2:CPOL=1,CPHA=0。SCK串行时钟线空闲是为高电平,数据在SCK时钟的下降沿被采样,数据在SCK时钟的上升沿切换

模式3:CPOL=1,CPHA=1。SCK串行时钟线空闲是为高电平,数据在SCK时钟的上升沿被采样,数据在SCK时钟的下降沿切换

其中比较常用的模式是模式0和模式3。为了更清晰的描述SPI总线的时序,下面展现了模式0下的SPI时序图

上图清晰的表明在模式0下,在空闲状态下,SCK串行时钟线为低电平,当SS被主机拉低以后,数据传输开始,数据线MOSI和MISO的数据切换(Toggling)发生在时钟的下降沿(上图的黑色虚线),而数据线MOSI和MISO的数据的采样(Sampling)发生在数据的正中间(上图中的灰色实线)。下图清晰的描述了其他三种模式数据线MOSI和MISO的数据切换(Toggling)位置和数据采样位置的关系图

下面我将以模式0为例用Verilog编写SPI通信的代码。

三、目标任务

1、编写SPI通信的Verilog代码并利用ModelSim进行时序仿真

2、阅读QualSPI的芯片手册,理解操作时序,并利用任务1编写的代码与QualSPI进行SPI通信,读出QualSPIFlash的Manufacturer/DeviceID

3、用SPI总线把存放在ROM里面的数据发出去,这在实际项目中用来配置SPI外设芯片很有用

四、设计思路与Verilog代码编写

4.1、SPI模块的接口定义与整体设计

Verilog编写的SPI模块除了进行SPI通信的四根线以外还要包括一些时钟、复位、使能、并行的输入输出以及完成标志位。其框图如下所示

其中:

I_clk是系统时钟;

I_rst_n是系统复位;

I_tx_en是主机给从机发送数据的使能信号,当I_tx_en为1时主机才能给从机发送数据;

I_rx_en是主机从从机接收数据的使能信号,当I_rx_en为1时主机才能从从机接收数据;

I_data_in是主机要发送的并行数据;

O_data_out是把从机接收回来的串行数据并行化以后的并行数据;

O_tx_done是主机给从机发送数据完成的标志位,发送完成后会产生一个高脉冲;

O_rx_done是主机从从机接收数据完成的标志位,接收完成后会产生一个高脉冲;

I_spi_miso、O_spi_cs、O_spi_sck和O_spi_mosi是标准SPI总线协议规定的四根线;

要想实现上文模式0的时序,最简单的办法还是设计一个状态机。为了方便说明,这里把模式0的时序再在下面贴一遍

由于是要用FPGA去控制或读写QSPIFlash,所以FPGA是SPI主机,QSPI是SPI从机。

发送:当FPGA通过SPI总线往QSPIFlash中发送一个字节(8-bit)的数据时,首先FPGA把CS/SS片选信号设置为0,表示准备开始发送数据,整个发送数据过程其实可以分为16个状态:

状态0:SCK为0,MOSI为要发送的数据的最高位,即I_data_in[7]

状态1:SCK为1,MOSI保持不变

状态2:SCK为0,MOSI为要发送的数据的次高位,即I_data_in[6]

状态3:SCK为1,MOSI保持不变

状态4:SCK为0,MOSI为要发送的数据的下一位,即I_data_in[5]

状态5:SCK为1,MOSI保持不变

状态6:SCK为0,MOSI为要发送的数据的下一位,即I_data_in[4]

状态7:SCK为1,MOSI保持不变

状态8:SCK为0,MOSI为要发送的数据的下一位,即I_data_in[3]

状态9:SCK为1,MOSI保持不变

状态10:SCK为0,MOSI为要发送的数据的下一位,即I_data_in[2]

状态11:SCK为1,MOSI保持不变

状态12:SCK为0,MOSI为要发送的数据的下一位,即I_data_in[1]

状态13:SCK为1,MOSI保持不变

状态14:SCK为0,MOSI为要发送的数据的最低位,即I_data_in[0]

状态15:SCK为1,MOSI保持不变

一个字节数据发送完毕以后,产生一个发送完成标志位O_tx_done并把CS/SS信号拉高完成一次发送。通过观察上面的状态可以发现状态编号为奇数的状态要做的操作实际上是一模一样的,所以写代码的时候为了精简代码,可以把状态号为奇数的状态全部整合到一起。

接收:当FPGA通过SPI总线从QSPIFlash中接收一个字节(8-bit)的数据时,首先FPGA把CS/SS片选信号设置为0,表示准备开始接收数据,整个接收数据过程其实也可以分为16个状态,但是与发送过程不同的是,为了保证接收到的数据准确,必须在数据的正中间采样,也就是说模式0时序图中灰色实线的地方才是代码中锁存数据的地方,所以接收过程的每个状态执行的操作为:

状态0:SCK为0,不锁存MISO上的数据

状态1:SCK为1,锁存MISO上的数据,即把MISO上的数据赋值给O_data_out[7]

状态2:SCK为0,不锁存MISO上的数据

状态3:SCK为1,锁存MISO上的数据,即把MISO上的数据赋值给O_data_out[6]

状态4:SCK为0,不锁存MISO上的数据

状态5:SCK为1,锁存MISO上的数据,即把MISO上的数据赋值给O_data_out[5]

状态6:SCK为0,不锁存MISO上的数据

状态7:SCK为1,锁存MISO上的数据,即把MISO上的数据赋值给O_data_out[4]

状态8:SCK为0,不锁存MISO上的数据

状态9:SCK为1,锁存MISO上的数据,即把MISO上的数据赋值给O_data_out[3]

状态10:SCK为0,不锁存MISO上的数据

状态11:SCK为1,锁存MISO上的数据,即把MISO上的数据赋值给O_data_out[2]

状态12:SCK为0,不锁存MISO上的数据

状态13:SCK为1,锁存MISO上的数据,即把MISO上的数据赋值给O_data_out[1]

状态14:SCK为0,不锁存MISO上的数据

状态15:SCK为1,锁存MISO上的数据,即把MISO上的数据赋值给O_data_out[0]

一个字节数据接收完毕以后,产生一个接收完成标志位O_rx_done并把CS/SS信号拉高完成一次数据的接收。通过观察上面的状态可以发现状态编号为偶数的状态要做的操作实际上是一模一样的,所以写代码的时候为了精简代码,可以把状态号为偶数的状态全部整合到一起。而这一点刚好与发送过程的状态刚好相反。

思路理清楚以后就可以直接编写Verilog代码了,spi_module模块的代码如下:

整个代码的流程与之前分析的流程完全一致。接下来就对这个代码用ModelSim进行基本的仿真。由于接收部分不再硬件上不太好测,所以这里只对发送部分进行测试,接收部分等把代码下载到板子里面以后用ChipScope抓接收部分时序就一清二楚了。

发射部分的测试激励代码如下:

`timescale1ns/1psmoduletb_spi_module;//InputsregI_clk;regI_rst_n;regI_rx_en;regI_tx_en;reg[7:0]I_data_in;regI_spi_miso;//Outputswire[7:0]O_data_out;wireO_tx_done;wireO_rx_done;wireO_spi_sck;wireO_spi_cs;wireO_spi_mosi;//InstantiatetheUnitUnderTest(UUT)spi_moduleuut(.I_clk(I_clk),.I_rst_n(I_rst_n),.I_rx_en(I_rx_en),.I_tx_en(I_tx_en),.I_data_in(I_data_in),.O_data_out(O_data_out),.O_tx_done(O_tx_done),.O_rx_done(O_rx_done),.I_spi_miso(I_spi_miso),.O_spi_sck(O_spi_sck),.O_spi_cs(O_spi_cs),.O_spi_mosi(O_spi_mosi));initialbegin//InitializeInputsI_clk=0;I_rst_n=0;I_rx_en=0;I_tx_en=1;I_data_in=8'h00;I_spi_miso=0;//Wait100nsforglobalresettofinish#100;I_rst_n=1;endalways#10I_clk=~I_clk;always@(posedgeI_clkornegedgeI_rst_n)beginif(!I_rst_n)I_data_in<=8'h00;elseif(I_data_in==8'hff)beginI_data_in<=8'hff;I_tx_en<=0;endelseif(O_tx_done)I_data_in<=I_data_in+1'b1;endendmodule

ModelSim的仿真图如下图所示:

由图可以看到仿真得到的时序与SPI模式0的时序完全一致。

4.2、W25Q128BVQualSPIFlash存储器时序分析

由于我们的任务是利用标准四线SPI总线读取QSPIFLASH的Manufacturer/DeviceID,所以先到W25Q128BV的芯片手册中找到它的读Manufacturer/DeviceID的时序。时序如下图所示:

整个读QSPIFLASH的过程为:FPGA先拉低CS片选信号,然后通过SPI总线发送命令码90,命令码发完以后,发送24-bit的地址24’h000000,接着在第32个SCK的下降沿准备接收ManufacturerID,ManufacturerID接收完毕以后开始接收DeviceID,最后把CS片选拉高,一次读取过程全部结束。这里既涉及到了SPI的写操作,也涉及到了SPI的读操作,刚好可以测试一下上面写的代码。

4.3、构思状态机并用ChipScope抓读写时序

由时序图可以很轻松的分析出,用一个7个状态的状态机来实现读ID的过程,其中状态的跳变可通过发送完成标志O_tx_done与接收完成标志O_rx_done来切换,各个状态的功能如下:

状态0:打开spi_module的发送使能开关,并初始化命令字90,等O_tx_done标志为高后切换到下一状态并设置好下一次要发送的数据;

状态1:打开spi_module的发送使能开关,并设置低8位地址00,等O_tx_done标志为高后切换到下一状态并设置好下一次要发送的数据;

状态2:打开spi_module的发送使能开关,并设置中8位地址00,等O_tx_done标志为高后切换到下一状态并设置好下一次要发送的数据;

状态3:打开spi_module的发送使能开关,并设置高8位地址00,等O_tx_done标志为高后切换到下一状态并设置好下一次要发送的数据;

状态4:关闭spi_module的发送使能开关,打开spi_module的接收使能开关,等O_rx_done标志为高后切换到下一状态;

状态5:关闭spi_module的发送使能开关,打开spi_module的接收使能开关,等O_rx_done标志为高后切换到下一状态,并关闭spi_module所有使能开关;

状态6:结束状态,关闭spi_module所有使能开关;

读ID的完整代码如下:

用ChipScope抓取的时序图如下图所示:

通过对比与芯片手册的时序图可以发现,每个节拍与芯片手册提供的读ID的时序完全一致。

4.4、用FPGA通过SPI总线配置外设芯片

上文的例子已经包括了连续发送4个字节数据和连续接收2个字节数据,实际上在很多应用中只需要FPGA通过SPI总线给芯片发送相应寄存器的值就可以对芯片的功能进行配置了,而并不需要接收芯片返回的数据,大家可以依着葫芦画瓢把硬件工程师发过来的芯片寄存器表(实际上很多芯片都有配置软件,硬件工程师在配置软件中设定好参数以后可以自动生成寄存器表)通过像上文那样写一个状态机发出去来配置芯片的功能。

在寄存器数目比较少的情况下,比如就30~40个以下的寄存器需要配置的情况下,完全可以按照上面的思路写一个30~40个状态的状态机,每个状态通过SPI总线发送一个数据,这样做的好处是以后想要在其他地方移植这套代码或者做版本的维护与升级时只需要复制上一版本的代码就可以了,移植起来非常方便。但是如果需要配置的寄存器有好几百甚至上千个或者需要用SPI总线往一些显示设备(比如OLED屏,液晶显示屏)里面发送数据的话,如果去写一个上千个状态的状态机显然不是最好的选择,所以对于这种需要用SPI传输大量数据的情况,我比较推荐的方式是先把数据存放在ROM里面,然后通过上面的SPI代码发出去。

在做这件事情之前,在重复理解一下SPI发送过程的时序:

状态0:SCK为0,MOSI为要发送的数据的最高位,即I_data_in[7],拉低O_tx_done信号

状态1:SCK为1,MOSI保持不变,拉低O_tx_done信号

状态2:SCK为0,MOSI为要发送的数据的次高位,即I_data_in[6],拉低O_tx_done信号

状态3:SCK为1,MOSI保持不变,拉低O_tx_done信号

状态4:SCK为0,MOSI为要发送的数据的下一位,即I_data_in[5],拉低O_tx_done信号

状态5:SCK为1,MOSI保持不变,拉低O_tx_done信号

状态6:SCK为0,MOSI为要发送的数据的下一位,即I_data_in[4],拉低O_tx_done信号

状态7:SCK为1,MOSI保持不变,拉低O_tx_done信号

状态8:SCK为0,MOSI为要发送的数据的下一位,即I_data_in[3],拉低O_tx_done信号

状态9:SCK为1,MOSI保持不变,拉低O_tx_done信号

状态10:SCK为0,MOSI为要发送的数据的下一位,即I_data_in[2],拉低O_tx_done信号

状态11:SCK为1,MOSI保持不变,拉低O_tx_done信号

状态12:SCK为0,MOSI为要发送的数据的下一位,即I_data_in[1],拉低O_tx_done信号

状态13:SCK为1,MOSI保持不变,拉低O_tx_done信号

状态14:SCK为0,MOSI为要发送的数据的最低位,即I_data_in[0],拉高O_tx_done信号

状态15:SCK为1,MOSI保持不变,拉低O_tx_done信号

可以看出,每一个bit为实际上是占了2个时钟周期(这里的时钟周期指的是系统时钟I_clk),发送一个字节完成标志位O_tx_done信号是在第14个状态拉高的,也就是在最后一个bit的前时钟周期产生了一个高电平,我之所以这么做的目的一是为了更好的整合代码,把偶数状态全部归类到一起,二是为了在连续发送数据时,在检测到O_tx_done信号为高以后,可以提前把下一次要发送的数据准备好。大家可以在对照着下面时序图理解一下,下面这张图可以很清晰的看到,O_tx_done信号是在最后一个数据的前一个时钟周期拉高的。

现在我们的目的是想要把ROM里面的数据通过SPI总线发出来,但是由于ROM是更新了地址以后的下一个时钟周期才能读出新数据,也就是说,如果我们在检测到O_tx_done为高时更新ROM地址的话,新的数据其实并没有准备好,直接看代码和时序图。

在此之前先把ROM配置好,我配置的ROM非常简单,ReadWidth设置为8,ReadDepth设置为10,

ROM的初始化数据.coe文件的内容如下所示:

MEMORY_INITIALIZATION_RADIX=16;

MEMORY_INITIALIZATION_VECTOR=

33,

24,

98,

00,

47,

ff,

a3,

49;

顶层代码如下所示:

从上面的时序图可以很清楚的看出,当ROM的地址加1以后,ROM的数据是滞后了一个时钟才输出的,而ROM数据输出的时刻(这个时候ROM的输出数据并没有稳定)刚好是spi_module模块发送下个数据最高位的时刻,那么这就有可能导致数据发送错误,从以上时序图就可以看出8’h33和8’h24两个数据正确发送了,但是8’h98这个数据就发送错误了。

观察上面的时序图可以发现,增加冗余状态以后,ROM里面的10个数据全部发送正确了。最后把代码综合生成bit文件,下载到开发板里面用ChipScope抓出时序图如下所示

可以看出,时序和用ModelSim得到的一模一样。至此,整个用SPI总线传输ROM里面数据的实验全部结束。

五、进一步思考

5.1、如果外设芯片的数据位宽是16-bit或者32-bit怎么办?

上文已经完成了8-bit数据从ROM里面通过SPI发送出去的例子,16-bit和32-bit可以照着葫芦画瓢,无非就是多增加几个状态而已。

5.2、发送数据的状态机和接收数据的状态机可以用移位的方式来做

事实上那个状态机的发送8-bit数据和接收8-bit数据的部分只有一行代码是不同的,所以也可以用移位的方法来做,然后把偶数状态也可以整合到一起,这样写的代码会更短更精炼。但出于理解更容易的角度,还是分开写较好。

THE END
1.宠物微信群最新动态,共享养宠快乐与责任之旅电力工程摘要:宠物微信群最新动态分享快乐与责任。宠物爱好者们汇聚一堂,分享养宠心得、交流宠物健康知识,共同承担照顾宠物的责任。最新资讯、活动通知、求助信息等在群内实时更新,为宠物主人带来便利与乐趣。我们致力于创造一个充满爱与...http://hngxdl.com/post/1278.html
2.宠物公众号运营方法和技巧内容中心宠物公众号作为社交媒体平台上的一个重要领域,已经吸引了越来越多的宠物爱好者。如何在这个竞争激烈的领域中脱颖而出,成为宠物公众号运营者的共同关注点。本文将为您介绍一些宠物公众号运营的方法和技巧,帮助您打造一个成功的宠物公众号。 1. 确定目标受众群体 ...http://ad.365editor.com/information/detail_3345
3.微信公众账号文案写作技巧:怎么撰写吸引人的文章教程撰写公众号文案时,首先要明确文章的目标。比如,你期望文章能够提升知名度、推广新产品,或是提供行业资讯、解答使用者疑问。明确目标后,你可更有针对性地实行写作。 确定主题 依照文章目标,选择一个具有针对性的主题。例如,倘若你的目标是加强知名度可选择介绍历、文化、产品特点等;若是目标是推广新产品,能够选择介绍...http://www.slrbs.com/jrzg/aixuexi/192342.html
4.微信公众号首次关注欢迎语怎么写?之前我们说了公众号名字和公众号头像肯定是非常重要的一点,具体可以看《怎么让大家一眼就记住你的公众号?》,而这些做好之后,肯定是需要注意微信公众号首次关注的欢迎语了。 微信公众号的欢迎语是与用户的第一次交流,直接就给出了第一次印象。欢迎语写的好,在用户脑中留下深刻印象,写的差,用户不知你为何物。所...http://www.pigcms.com/2016/materail_0614/5658.html
5.公众号用什么软件制作最好APP推荐公众号文章用什么软件编辑 公众号文章编辑软件推荐 有的人需要编辑公众号文章,但是没有对应的工具写起来很费劲,公众号文章用什么软件编辑?只要善于利用这些软件就能让你随心所欲地编辑出一篇华丽又排列整齐的公众号文章,这样就会为你吸引越来越多的读者,并成为你的忠实粉丝,让你从此彻底地爱上写作,更加开心!1、《word...https://www.wandoujia.com/bangdan/554914/
1.学生党想趁暑假在网上兼职赚点钱,有没有什么好推荐?你可以直接用你养的小宠物或者搞笑的室友来做表情包,重点不在于做的多精美,而是做的多有趣。 在哪里上传?搜索“微信表情开放平台”,就能找到了,表情包制作这方面网上一搜也都有教程。 泡芙真的太可爱了! 4、写作兼职(代写文章/投稿公众号) 这个是老生常谈了,提醒一下大家,除非壕,否则不要去报那些写作班,不...https://www.hg-daigou.com/hy/news-id-13957.html
2.如何玩转视频号获得高赞?这份20000字干货指南解答一切2020 年 1 月 9 日,腾讯集团高级执行副总裁、微信事业群总裁张小龙在微信公开课上带来了一段演讲视频,其中特别提到了「短内容」, 表示「相对公众号而言,我们缺少了一个人人可以创作的载体。因为不能要求每个人都能天天写文章。就像之前在公开课所说的一样,这一直是微信要发力的方向」。 https://www.36kr.com/p/674805899899913/
3.如何写公众号简介:公众号简介的3种必备要素和5种写法如何为公众号设计头像:想了解如何设计一个属于自己风格的微信公众号头像可以点击《如何制作微信公众号头像:设计微信头像的四个方法》 查看。 在这一篇文章中,我要给大家讲的是如何写好微信公众号的简介。 首先我们要知道:公众号简介是什么?公众号简介就是公众号头像下方的介绍内容,一般会介绍公众号提供哪些功能,哪些...https://www.jianshu.com/p/112de530733d
4.有点小神经质,博美犬种介绍微信公众号:北鼻宠物圈 本篇文章使用有道云笔记编辑 点击体验 联想美的微信狐狸外向 END 阅读27 声明:本文内容由脉脉用户自发贡献,部分内容可能整编自互联网,版权归原作者所有,脉脉不拥有其著作权,亦不承担相应法律责任。如果您发现有涉嫌抄袭的内容,请发邮件至maimai@taou.com,一经查实,将立刻删除涉嫌侵权内容。 https://maimai.cn/article/detail?fid=881471659&efid=_4f8j6dGxQM_pRZL2xe8sw
5.我玩小红书总结的88条关键经验15、账号有过违规后,笔记流量突然下滑了很多,需要换号吗? 如果只是普通违规,比如某篇笔记被警告、个人介绍违规等,只要正常发笔记、正常互动,一般一个月左右是可以恢复的。 16、违规的笔记是隐藏还是删除? 建议直接删除。隐藏会导致系统记录一直存在。 17、近期发布笔记的小眼睛都只有一两百,是不是被限流了? https://www.digitaling.com/articles/1217593.html
6.VC老板的日常:6成找钱,3成投钱,还有1成要写公号冯斯基:2019 年当时其实我们是一个新品牌,第一篇文章是 2019 年写的,但是 2019 年这篇文章没有得到市场中的一些反应,所以公众号真正开始做起来是从 2020 年开始的。 当时为什么做这个事情呢?我们成立这个机构,总要向我们的客户,也就是 LP,介绍我们是谁。一家公司刚成立的时候,受众对这家初创公司是不了解的,...https://www.thepaper.cn/newsDetail_forward_25821548
7.自驾小车进出岛之新手级攻略有过海需求的司机旅客朋友们,需提前通过“徐闻港”或“琼州海峡轮渡管家”微信公众号上预约购票,合理安排进岛行程,未预约的车辆将不能进入港区。 24小时客服热线: ①海安新港客服热线: 0759-4683286 ②徐闻港客服热线: 0759-4663889 ③新海港、秀英港: https://www.meipian.cn/50c1lmm0
8.微信视频号介绍怎么写?视频号简介写作技巧视频号运营自媒体这篇文章主要介绍了微信视频号介绍怎么写,视频号简介写作技巧的相关内容,如果你想进军微信视频号的话,可以参考下这篇文章。 GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用! 【如果你想靠AI翻身,你先需要一个靠谱的工具!】 微信视频号无论对于内容创业人群还是对于推广自己实物产品的网络人,微信视频号的出现即 将...https://www.jb51.net/zimeiti/764549.html
9.全国12315平台热线办理进度查询 请登录 2024年11月21日星期四 投诉公示 企业服务 您购买商品或接受服务 认为经营者侵犯您的合法权益 我要投诉 您发现违反 市场监管法律法规的行为 我要举报 您需要了解 市场监管有关法律法规 我要咨询https://www.12315.cn/
10.微信公众号的文章编辑界面在哪里?怎么编辑排版?微信公众号指南今天给大家介绍公众号文章编辑页面在哪里,怎么编辑排版,怎么推送文章。 申请了微信公众号后怎么发布文章?公众号的文章编辑页面在哪里?部分刚接触公众号运营的小伙伴是不太了解公众号后台功能的,今天就给大家介绍公众号文章编辑页面在哪里,怎么编辑排版,怎么推送文章。 https://yiban.io/blog/10608
11.一篇文章教你学会公众号IP写作(新手小白必备)“IP写作,简单来说,就是通过在公众号上持续写出有价值的文章,来建立个人影响力。 让读者了解你、信任你、找你付费。实现高价值、强粘性、快变现的写作模式。” 了解了什么是 IP 写作,那么要怎么写呢? 下面我会从文章的标题,开头,正文,结尾来分别介绍: ...https://blog.csdn.net/lvonve/article/details/139693224
12.中华艺术宫讲座行书怎么写?这场活动请书画名家现场教你参与方式:微信公众号免费预约 汤之《盘铭》文:“苟日新,日日新,又日新”。联想到我们在学习绘画和书法时的状态,尝思:如何在学术上持久推进?如何在书画创作上有所突破?如何在专业上能做到“日新而又新”? 11月7日下午,中华艺术宫(上海美术馆)“书画名家教创作”活动推出首期——“怎样写行书”,带你走近“海上...https://www.jfdaily.com/sgh/detail?id=575849